【问题标题】:Get the latest entry for a given day in Oracle在 Oracle 中获取给定日期的最新条目
【发布时间】:2014-12-21 16:44:11
【问题描述】:

我要选择

 data12 [last entry for 12-21-2014],
 data11 [last entry for 12-20-2014],
 data8  [last entry for 12-19-2014] 

来自下表。

   snapshot_datestamp   data
-------------------------------   
 12-21-2014 08:24:21    data12
 12-20-2014 19:58:49    data11
 12-20-2014 19:55:36    data10
 12-20-2014 19:53:59    data9
 12-19-2014 21:56:23    data8
 12-19-2014 21:13:16    data7
 12-19-2014 11:05:45    data6
 12-19-2014 11:05:07    data5
 12-19-2014 10:56:13    data4
 12-19-2014 10:52:21    data3
 12-19-2014 10:50:43    data2
 12-19-2014 10:49:30    data1

不太清楚如何实现这一点。任何指针都会有很大帮助。

【问题讨论】:

  • 你使用的是哪个DBMS
  • @Soumya 此处发布的所有答案都是绝对正确的,您的问题以多种方式得到解决,您可以选择任何一种...

标签: sql oracle greatest-n-per-group sysdate


【解决方案1】:

一种方法是获取每天的最新时间,然后选择对应的记录:

select
  trunc(snapshot_datestamp),
  data
from mytable
where snapshot_datestamp in
(
  select max(snapshot_datestamp)
  from mytable
  group by trunc(snapshot_datestamp)
)
order by trunc(snapshot_datestamp);

另一个是使用解析函数:

select 
  trunc(snapshot_datestamp),
  max(data) keep (dense_rank last order by snapshot_datestamp)
from mytable
group by trunc(snapshot_datestamp)
order by trunc(snapshot_datestamp);

【讨论】:

    【解决方案2】:

    假设我们可以在这里使用的数据中没有任何键,使用ROW_NUMBER 可能是一种解决方案:

    SELECT "snapshot_datestamp", "data" FROM
    (
    
        SELECT "snapshot_datestamp", "data",
               ROW_NUMBER() 
                OVER (PARTITION BY TRUNC("snapshot_datestamp")
                      ORDER BY "snapshot_datestamp" DESC) rn
        FROM T
    ) V
    WHERE rn = 1
    ORDER BY 1 DESC
    

    这里的想法是为给定日期的每一行编号(根据它们的“时间戳”降序排列)。完成后,每个分区的“最后一个”条目就是该分区中编号为 1 的行。

    http://sqlfiddle.com/#!4/df1708/3

    【讨论】:

      【解决方案3】:

      简单的方法是使用Order byROWNUM

      SELECT *
      FROM   (SELECT data
              FROM   tablename
              WHERE  trunc(snapshot_datestamp)  = TO_DATE('12-21-2014','MM-DD-YYYY')
              ORDER  BY snapshot_datestamp DESC)
      WHERE  ROWNUM = 1; 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-08
        相关资源
        最近更新 更多