首页 > 解决方案 > SQL:使用 Partion By 替代 Group By 方法

问题描述

我在 DW 系统中有一个表(比如 AWS SnowFlake):

UPC_CODE    A_PRICE     A_QTY    DATE       COMPANY_CODE    A_CAT
1001        100.25       2     2021-05-06      1             PB
1001        2122.75      10    2021-05-01      1             PB
1002        212.75       5     2021-05-07      2             PT
1002        3100.75      10    2021-05-01      2             PB

我正在寻找的是:

For each UPC_CODE and COMPANY_CODE the latest data should be picked up

所以结果表应该如下所示:

UPC_CODE    A_PRICE     A_QTY    DATE       COMPANY_CODE    A_CAT
1001        100.25       2     2021-05-06      1             PB
1002        212.75       5     2021-05-07      2             PT

方法:在 SQL 字符串下面

SELECT  UPC_CODE,A_PRICE,A_QTY,MAX(DATE) AS F_DATE,COMPANY_CODE,A_CAT 
FROM <table_name>
GROUP BY 1,2,3,5,6

我可以使用另一种方法partionby()吗?

标签: sql

解决方案


您当前的GROUP BY查询并没有真正做到您的想法。这里的一种规范方法使用ROW_NUMBER

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY UPC_CODE, COMPANY_CODE ORDER BY DATE DESC) rn
    FROM yourTable
)

SELECT UPC_CODE, A_PRICE, A_QTY, DATE, COMPANY_CODE, A_CAT
FROM cte
WHERE rn = 1;

如果您确实想使用一种GROUP BY方法,这是一种方法:

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT UPC_CODE, COMPANY_CODE, MAX(DATE) AS MAX_DATE
    FROM yourTable
    GROUP BY UPC_CODE, COMPANY_CODE
) t2
    ON t2.UPC_CODE = t1.UPC_CODE AND
       t2.COMPANY_CODE = t1.COMPANY_CODE AND
       t2.MAX_DATE = t1.DATE;

推荐阅读