为了账号安全,请及时绑定邮箱和手机立即绑定

Oracle SQL查询:根据时间检索每组的最新值

/ 猿问

Oracle SQL查询:根据时间检索每组的最新值

www说 2019-12-02 08:04:04

Oracle SQL查询:根据时间检索每组的最新值

我在Oracle DB中有下表


id     date              quantity

1      2010-01-04 11:00  152

2      2010-01-04 11:00  210

1      2010-01-04 10:45  132

2      2010-01-04 10:45  318

4      2010-01-04 10:45  122

1      2010-01-04 10:30  1

3      2010-01-04 10:30  214

2      2010-01-04 10:30  5515

4      2010-01-04 10:30  210

现在我想检索每个id的最新值(及其时间)。示例输出:


id     date              quantity

1      2010-01-04 11:00  152

2      2010-01-04 11:00  210

3      2010-01-04 10:30  214

4      2010-01-04 10:45  122

我只是无法弄清楚如何将它放入查询......


此外,以下选项会很好:


选项1:查询应仅返回最后XX分钟的值。


选项2:id应与另一个具有id和idname的表中的文本连接。id的输出应该是:id-idname(例如1-testid1)。


非常感谢您的帮助!


查看完整描述

2 回答

?
喵喔喔

鉴于此数据......


SQL> select * from qtys

  2  /


        ID TS                      QTY

---------- ---------------- ----------

         1 2010-01-04 11:00        152

         2 2010-01-04 11:00        210

         1 2010-01-04 10:45        132

         2 2010-01-04 10:45        318

         4 2010-01-04 10:45        122

         1 2010-01-04 10:30          1

         3 2010-01-04 10:30        214

         2 2010-01-04 10:30       5515

         4 2010-01-04 10:30        210


9 rows selected.


SQL>

...以下查询给出了你想要的......


SQL> select x.id

  2         , x.ts as "DATE"

  3         , x.qty as "QUANTITY"

  4  from (

  5      select id

  6             , ts

  7             , rank () over (partition by id order by ts desc) as rnk

  8             , qty

  9      from qtys ) x

 10  where x.rnk = 1

 11  /


        ID DATE               QUANTITY

---------- ---------------- ----------

         1 2010-01-04 11:00        152

         2 2010-01-04 11:00        210

         3 2010-01-04 10:30        214

         4 2010-01-04 10:45        122


SQL>

关于附加要求,可以对外部WHERE子句应用其他过滤器。类似地,您可以将其他表连接到内联视图,就像任何其他表一样。



查看完整回答
反对 回复 2019-12-03
?
慕莱坞5435954

这是一个完整的,经过测试的例子。


CREATE TABLE tbl1 (ID NUMBER, dt DATE, quantity NUMBER);


DELETE FROM tbl1;

insert into tbl1 values (1,to_date('2010-01-04 11:00','YYYY-MM-DD HH24:MI'), 152);

insert into tbl1 values (2,to_date('2010-01-04 11:00','YYYY-MM-DD HH24:MI'), 210);

insert into tbl1 values (1,to_date('2010-01-04 10:45','YYYY-MM-DD HH24:MI'), 132);

insert into tbl1 values (2,to_date('2010-01-04 10:45','YYYY-MM-DD HH24:MI'), 318);

insert into tbl1 values (4,to_date('2010-01-04 10:45','YYYY-MM-DD HH24:MI'), 122);

insert into tbl1 values (1,to_date('2010-01-04 10:30','YYYY-MM-DD HH24:MI'), 1);

insert into tbl1 values (3,to_date('2010-01-04 10:30','YYYY-MM-DD HH24:MI'), 214);

insert into tbl1 values (2,to_date('2010-01-04 10:30','YYYY-MM-DD HH24:MI'), 5515);

insert into tbl1 values (4,to_date('2010-01-04 10:30','YYYY-MM-DD HH24:MI'), 210);


SELECT t.ID

     , t.DT

     , t.QUANTITY

  FROM tbl1 t

     ,( SELECT ID

             , MAX(dt) dt

          FROM tbl1

       GROUP BY ID ) t2

  WHERE t.id = t2.id

    AND t.dt = t2.dt

结果:


1   1/4/2010 11:00:00 AM    152

2   1/4/2010 11:00:00 AM    210

3   1/4/2010 10:30:00 AM    214

4   1/4/2010 10:45:00 AM    122

如果你想获得最后XX分钟的记录,你可以这样做(我在这个例子中使用500分钟,用你想要的任何东西替换500):


   SELECT t.ID

        , t.DT

        , t.QUANTITY

     FROM tbl1 t

        ,( SELECT ID

                , MAX(dt) dt

             FROM tbl1

            WHERE dt >= SYSDATE - (500 / 1400)

          GROUP BY ID ) t2

     WHERE t.id = t2.id

       AND t.dt = t2.dt;



查看完整回答
反对 回复 2019-12-03

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信