Window 函数中的不同计数

Distinct Counts in a Window Function

我正在尝试在具有多级分区的 window 函数中获取不同的行数。以下是我的数据示例。

PRODUCT_ID KEY_ID STORECLUSTER
1000078 120 LLNY
1000078 202 LLF
1000078 202 LLNY
1000078 202 LLNY

我想查看每个 PRODUCT_ID,然后查看每个独特的 KEY_ID,并确定每个 KEY_ID 有多少独特的 STORECLUSTERS。例如 PRODUCT_ID 1000078 有两个独特的 KEY_ID(120 和 202),其中 120 有 1 个独特的 STORECLUSTER,202 有 2 个独特的 STORECLUSTER。我试过使用 RANK()DENSE_RANK() 但我似乎无法正确分区。我想要一个看起来像这样的 table:

PRODUCT_ID KEY_ID STORECLUSTER STORECLUSTER_COUNT
1000078 120 LLNY 1
1000078 202 LLF 2
1000078 202 LLNY 2
1000078 202 LLNY 2

很遗憾,SQL 服务器不支持 COUNT(DISTINCT 作为 window 函数。

所以你需要嵌套window个函数。我发现最简单和最有效的方法是 MAX 而不是 DENSE_RANK,但还有其他方法。

分区子句相当于普通聚合中的 GROUP BY,然后您 DISTINCTing 的值进入 DENSE_RANKORDER BY。因此,您计算排名,同时忽略并列结果,然后对每个分区取最大排名。

SELECT
  PRODUCT_ID,
  KEY_ID,
  STORECLUSTER,
  STORECLUSTER_COUNT = MAX(rn) OVER (PARTITION BY PRODUCT_ID, KEY_ID)
FROM (
    SELECT *,
      rn = DENSE_RANK() OVER (PARTITION BY PRODUCT_ID, KEY_ID ORDER BY STORECLUSTER)
    FROM YourTable t
) t;

db<>fiddle