簡體   English   中英

Postgresql 如何聚合表中的數據以生成具有范圍內唯一值的匯總表

[英]Postgresql how do I aggregate the data in a table to produce a summarized table with unique values in a range

所以,我是新來的postgresql,我的數據如下:

PRODUCT WKnum SALES
HAMMER  1   17
HAMMER  2   20
HAMMER  3   17
HAMMER  4   10
HAMMER  5   12
HAMMER  6   13
HAMMER  7   2
HAMMER  8   25
SINK    1   25
SINK    2   20
SINK    3   9
SINK    4   7
SINK    5   24
SINK    6   16
SINK    7   10
SINK    8   16
BUCKET  1   22
BUCKET  2   2
BUCKET  3   10
BUCKET  4   24
BUCKET  5   9
BUCKET  6   20
BUCKET  7   9
BUCKET  8   21

然后我想要如下結果:

PRODUCT BEST_CONSEC_4WEEKS  BEST_CONSEC_4WEEKS_SLS
HAMMER    1-4                       64
SINK      5-8                       66
BUCKET    3-6                       63

其中“BEST_CONSEC_4WEEKS”是一個字符串,表示連續 4 周內銷售額最高的實際周數。 而“BEST_CONSEC_4WEEKS_SLS”提供了該產品在上述指定的幾周內售出的總單位數。 必須避免特定於數據庫的函數。

下面的一段代碼是我的嘗試,但它沒有像我預期的那樣工作。

SELECT PRODUCT, 
CASE WHEN Wknum IN ‘1 - 4’:: INTETER AS BEST_CONSEC_4WEEKS, 
SUM (CASE WHEN Wknum IS BETWEEN ‘1 AND 4’::INTEGER THEN SALES ELSE 0 END) OR 
SUM (CASE WHEN Wknum IS BETWEEN ‘5 AND 8’::INTEGER THEN SALES ELSE 0 END) 
SUM (CASE WHEN Wknum IS BETWEEN ‘3 AND 6’::INTEGER THEN SALES ELSE 0 END) AS BEST_CONSEC_4WEEKS_SLS
FROM TABLE1

誰能告訴我我做錯了什么? 謝謝

您可以使用帶有框架的 window 函數,如下所示:

with u as
(select PRODUCT, 
WKnum,
sum(SALES) over(partition by PRODUCT order by WKnum rows between current row and 3 following) as BEST_CONSEC_4WEEKS_SLS
from TABLE1),
v as
(select *, rank() over(partition by PRODUCT order by BEST_CONSEC_4WEEKS_SLS desc) as r
from u)
select PRODUCT,
concat(wknum, '-', wknum + 3) as BEST_CONSEC_4WEEKS,
BEST_CONSEC_4WEEKS_SLS
from v where r = 1

小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM