postgresql SQL中查询的聚集

svgewumm  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(143)

我有一张table,就像:
| 身份证|账户|日期|金额|
| - -----|- -----|- -----|- -----|
| 1. |ad@ind| 2022年11月7日|三五四|
| 2. |ad@ind| 2022年11月10日|五八六|
我需要找到记录,其中是最大的月份数,并获得金额在这个日期。怎么办?最大(日期)不适合,我需要在月份内的数字。
我试着按日期和金额分组,我试着做内部查询,但不是很幸运。

rkttyhzu

rkttyhzu1#

假设你想要每个月的记录,那么考虑使用窗口函数ROW_NUMBER()的以下解决方案:

SELECT id, account, date, amount
FROM 
    (
        SELECT yt.*,
           ROW_NUMBER() OVER (PARTITION BY EXTRACT(YEAR FROM date), EXTRACT(MONTH FROM date) ORDER BY date DESC) as rn
        FROM yourtable yt 
     )dt
WHERE rn = 1;

ROW_NUMBER()窗口函数功能为共享相同月份和年份的每行生成一个row_number,从1开始,按date列降序排序。获取rn1的记录是该月/年组合的最高日期。
使用与我在评论中分享的类似的逻辑,这可能会更慢,因为需要两次表扫描:

SELECT *
FROM yourtable yt
WHERE date = 
    (
        SELECT max(date)
        FROM yourtable yt2
        WHERE
           EXTRACT(MONTH FROM yt.date) = EXTRACT(MONTH FROM yt2.date
           AND EXTRACT(YEAR FROM yt.date) = EXTRACT YEAR FROM yt2.date)
     )

相关问题