sql—postgres中查找最后一个值的聚合

l2osamch  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(237)

我在postgres中有一个表,其中包含聚合数据,这些表有以下字段
搜索项-->特定搜索项
日期-->执行搜索的日期
search\u count-->使用此搜索项执行搜索的次数
最小结果计数-->搜索项返回的最小结果数是多少
max\u results\u count-->搜索项返回的最大结果数是多少
上次搜索结果\u计数-->执行上次搜索时返回的搜索结果数
零\u结果\u计数-->此搜索项没有结果的天数
其中datesearch\u term的组合是唯一的,这意味着搜索项不会为该日期重复,而是更新值。
我正在尝试编写一个持续7天的sql查询,以获取以下记录
搜索\u项
最小结果计数
最大结果计数
零结果计数
上次\u结果\u计数
我可以使用聚合min,max,sum找到所有的值,但是我找不到最后一个\u结果\u计数的值,因为这需要我只选取最后一个值。
这是一个与预期结果相同的表

search_term    search_count    min_rc    max_rc    zero_count    last_rc    date
---------------------------------------------------------------------------------------
term1          10              10        20        0              4        01-01-2020
term1          10              11        21        0              5        02-01-2020
term1          10              12        22        0              6        03-01-2020
term1          10              13        23        0              7        04-01-2020
term1          10              14        24        0              8        05-01-2020

term2          10              24        25        0              9        01-01-2020
term2          10              23        26        0              10       02-01-2020
term2          10              22        27        0              11       03-01-2020
term2          10              21        28        0              12       04-01-2020
term2          10              0         29        3              0        04-01-2020

如果我运行查询05-01-2020,我应该

search_term    search_count    min_rc    max_rc    zero_count    last_rc
-------------------------------------------------------------------------
term1          50              10        24        0              8      
term2          50              0         29        3              0

如果我运行查询04-01-2020,我应该

search_term    search_count    min_rc    max_rc    zero_count    last_rc
-------------------------------------------------------------------------
term1          40              10        23        0              7      
term2          40              21        28        0              12

如果我运行03-01-2020查询,我应该

search_term    search_count    min_rc    max_rc    zero_count    last_rc
-------------------------------------------------------------------------
term1          30              10        23        0              6      
term2          30              22        27        0              11

rc代表结果计数
以此类推,任何有助于得出最后一个结果的方法都会非常有用

8xiog9wr

8xiog9wr1#

您可以使用行数窗口函数来实现此目的。 ROW_NUMBER 用inted命令数据,然后生成一个数字。

ROW_NUMBER()OVER(PARTITION BY date,search_term ORDER BY LAST_RC) AS ROW_NUMBERED_COLUMN

然后可以对数据进行分组并使用 MAX(ROW_NUMBERED_COLUMN)

mwyxok5s

mwyxok5s2#

您可以使用下面的窗口函数。

Select search_term ,
SUM(search_count) OVER (partition by search_term order BY date)  as search_count,
MIN(min_rc) OVER (partition by search_term order BY date)  as min_rc,
MAX(max_rc) OVER (partition by search_term order BY date)  as max_rc,
zero_count,
last_rc , 
DATE 
from t
ORDER BY search_term,date

结果集:

search_term    search_count    min_rc    max_rc    zero_count    last_rc   date
term1          10              10        20         0              4       01-01-2020
term1          20              10        21         0              5       02-01-2020
term1          30              10        22         0              6       03-01-2020
term1          40              10        23         0              7       04-01-2020
term1          50              10        24         0              8       05-01-2020
term2          10              24        25         0              9       01-01-2020
term2          20              23        26         0              10      02-01-2020
term2          30              22        27         0              11      03-01-2020
term2          50              0         29         0              12      04-01-2020
term2          50              0         29         3              0       04-01-2020

更新版本*

SELECT search_term,search_count, min_rc, max_rc, zero_count, last_rc
FROM
(SELECT search_term ,
        SUM(search_count) OVER (partition by search_term order BY date) as search_count,
        MIN(min_rc) OVER (partition by search_term order BY date) as min_rc,
        MAX(max_rc) OVER (partition by search_term order BY date) as max_rc,
        zero_count,
        last_rc,
        RANK() OVER (partition by search_term order BY date desc) as rnk,
        date
 FROM t
 WHERE date <= '05-01-2020'
 ) A 
 WHERE A.rnk = 1

另一个更简单的方法,我在你的评论后意识到你想要什么。

SELECT search_term ,
SUM(search_count) as search_count,
MIN(min_rc) as min_rc,
MAX(max_rc) as max_rc,
SUM(zero_count) as zero_count,
(SELECT last_rc FROM t as a WHERE a.search_term = t.search_term AND a.date = 
 t.date ORDER BY date desc LIMIT 1) AS last_rc,
MAX(date) as date
FROM t
WHERE date <= '05-01-2020'
GROUP BY search_term
ORDER BY search_term

使用窗口函数last\u value更简单

Select search_term ,
SUM(search_count) as search_count,
MIN(min_rc) as min_rc,
MAX(max_rc) as max_rc,
SUM(zero_count) as zero_count,
LAST_VALUE(last_rc) OVER (Partition by search_term ORDER BY date desc) AS last_rc,
MAX(date) as date
FROM t
WHERE date <= '03-01-2020'
GROUP BY search_term
ORDER BY search_term

使用任何更新版本的结果集。

search_term search_count    min_rc  max_rc  zero_count  last_rc
term1       50              10      24      0           8
term2       50              0       29      3           0

相关问题