sql 中查询的聚合

Aggregation of query in sql

提问人:danilchik22 提问时间:6/19/2023 最后编辑:Isolateddanilchik22 更新时间:6/19/2023 访问量:39

问:

我有表格,比如:

同上 帐户 日期
1. ad@ind 07.11.2022 354
2. ad@ind 10.11.2022 586

我需要找到记录,其中是最大月数并获取此日期的金额。它是怎么做的?Max(date) 不合适,我需要月内的数字。

我试着按日期和金额分组,我试着做内部查询,但运气不好。

sql PostgreSQL的 拥有

评论

0赞 JNevill 6/19/2023
这将看起来像.SELECT * FROM yourtable WHERE date = (SELECT max(date) FROM yourtable)
0赞 EdmCoff 6/19/2023
不确定我是否理解这个问题,但您可能有兴趣结合 JNell 的答案。extract(month from date)
0赞 JNevill 6/19/2023
哦。“月内数”“最大月数”对我来说,这在翻译中丢失了@EdmCoff。好渔获。
0赞 Salman A 6/19/2023
对不起,这是几月的?7 还是 11?如果一个月是 2022 年,另一个月是 2023 年怎么办?如果有两个帐户的数据怎么办?07.11.2022
1赞 jarlh 6/20/2023
另请注意,表具有,而不是记录。

答:

1赞 JNevill 6/19/2023 #1

假设您想要每个月的记录,那么请考虑使用窗口函数的以下解决方案: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,从 1 开始,按列降序排序。获取的记录是该月/年组合的最高日期。ROW_NUMBER()datern1


使用与我在评论中分享的类似的逻辑,由于需要两次表扫描,因此可能会较慢:

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)
     )

评论

0赞 danilchik22 6/20/2023
谢谢,我对窗口功能一无所知。但是您的代码只获得一个帐户。