为每个ID选择每月的最后一条记录

时间:2020-10-08 08:58:45

标签: sql sqlite subquery greatest-n-per-group window-functions

我正在尝试获取每个ID每月的最后一条记录。

下面是我要的表格:

myTable
ID  date         data
1   2020-08-27   a
1   2020-08-28   b
1   2020-09-30   c
2   2020-08-29   d
2   2020-09-30   e

因此,我希望获得以下信息:

output
ID  date         data
1   2020-08-28   b
1   2020-09-30   c
2   2020-08-29   d
2   2020-09-30   e

这里的“复杂性”是每个ID每月的最后一条记录可能会不同。

到目前为止,我仅通过以下请求设法使数据库中每个月的最后日期的所有记录可用:

SELECT ID, date, data
from myTable
and date in (SELECT max(date) FROM myTable GROUP BY strftime('%Y-%m', date))

这给了我

wrong output
ID  date         data
1   2020-09-30   c
2   2020-08-29   d
2   2020-09-30   e

2 个答案:

答案 0 :(得分:0)

您可以使用相关子查询进行过滤:

select t.*
from mytable t
and date = (
    select max(t1.date) 
    from mytable t1 
    where strftime('%Y-%m', t1.date) = strftime('%Y-%m', t.date) and t1.id = t.id
)

另一种使用窗口函数的方法:

select *
from (
    select t.*,
        rank() over(partition by id, strftime('%Y-%m', date) order by date desc) rn
    from mytable t
) t
where rn = 1

答案 1 :(得分:0)

具有ROW_NUMBER()窗口功能:

SELECT ID, date, data
FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY ID, strftime('%Y%m', date) ORDER BY date DESC) rn
  FROM myTable 
)
WHERE rn = 1