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
,然后您 DISTINCT
ing 的值进入 DENSE_RANK
的 ORDER 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;
我正在尝试在具有多级分区的 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
,然后您 DISTINCT
ing 的值进入 DENSE_RANK
的 ORDER 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;