PostgreSQL - 在使用 window 函数时我如何知道我在哪个分区?
PostgreSQL - how do I know which partition I'm in when using window functions?
我一直在使用 windows 函数,因为它们对我当前的要求非常有用。 row_number()
非常方便让我知道当前分区的行。我已经阅读了有关 window 函数的文档并进行了在线搜索,但找不到我想要的答案。我希望这里有人能告诉我我想要的是否可行。
我的问题是:是否有可能找出您所在 window 中的哪个分区,类似于 row_number()
告诉您您所在分区中的哪一行?
基本上,我想知道这样的事情,假设 window 中有 2 个分区,每个分区中有 2 行:
partition 1 row 1
partition 1 row 2
partition 2 row 1
partition 2 row 2
有什么想法吗?
我们可以尝试使用 DENSE_RANK
和 ROW_NUMBER
:
WITH yourTable AS (
SELECT 'A' AS col1, 1 AS col2 UNION ALL
SELECT 'A', 2 UNION ALL
SELECT 'A', 3 UNION ALL
SELECT 'B', 1 UNION ALL
SELECT 'B', 2 UNION ALL
SELECT 'B', 3
)
SELECT *,
DENSE_RANK() OVER (ORDER BY col1) partition1,
ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY col2) partition2
FROM yourTable
ORDER BY
col1, col2;
对于任意数量的分区,这里的一般模式是对前 N-1 个分区使用 DENSE_RANK
,然后在最后一个分区使用 ROW_NUMBER
。 ROW_NUMBER
将确保最后一个分区具有 1,2,3,... 作为序列。
我一直在使用 windows 函数,因为它们对我当前的要求非常有用。 row_number()
非常方便让我知道当前分区的行。我已经阅读了有关 window 函数的文档并进行了在线搜索,但找不到我想要的答案。我希望这里有人能告诉我我想要的是否可行。
我的问题是:是否有可能找出您所在 window 中的哪个分区,类似于 row_number()
告诉您您所在分区中的哪一行?
基本上,我想知道这样的事情,假设 window 中有 2 个分区,每个分区中有 2 行:
partition 1 row 1
partition 1 row 2
partition 2 row 1
partition 2 row 2
有什么想法吗?
我们可以尝试使用 DENSE_RANK
和 ROW_NUMBER
:
WITH yourTable AS (
SELECT 'A' AS col1, 1 AS col2 UNION ALL
SELECT 'A', 2 UNION ALL
SELECT 'A', 3 UNION ALL
SELECT 'B', 1 UNION ALL
SELECT 'B', 2 UNION ALL
SELECT 'B', 3
)
SELECT *,
DENSE_RANK() OVER (ORDER BY col1) partition1,
ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY col2) partition2
FROM yourTable
ORDER BY
col1, col2;
对于任意数量的分区,这里的一般模式是对前 N-1 个分区使用 DENSE_RANK
,然后在最后一个分区使用 ROW_NUMBER
。 ROW_NUMBER
将确保最后一个分区具有 1,2,3,... 作为序列。