Select每个ID每个月的最后一条记录
Select last record of each month for each ID
我正在尝试为每个 ID 提取每个月的最后一条记录。
下面是我请求的 table:
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
可以使用关联子查询进行过滤:
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
)
另一种方法使用 window 函数:
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
用ROW_NUMBER()window函数:
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
我正在尝试为每个 ID 提取每个月的最后一条记录。
下面是我请求的 table:
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
可以使用关联子查询进行过滤:
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
)
另一种方法使用 window 函数:
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
用ROW_NUMBER()window函数:
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