SQL DB2 根据计数拆分分组依据的结果
SQL DB2 Split result of group by based on count
我想根据计数将分组依据的结果分成几行,但我不知道这是否可能。例如,如果我有这样的查询:
SELECT doc.client, doc.template, COUNT(doc) FROM document doc GROUP BY doc.client, doc.template
和一个包含以下数据的 table 文档:
ID | name | client | template
1 | doc_a | a | temp_a
2 | doc_b | a | temp_a
3 | doc_c | a | temp_a
4 | doc_d | a | temp_b
查询结果为:
client | template | count
a | temp_a | 3
a | temp_b | 1
但如果计数大于 2,我想将结果的一行分成两行或更多行:
client | template | count
a | temp_a | 2
a | temp_a | 1
a | temp_b | 1
在 SQL 中有没有办法做到这一点?
你可以使用window函数然后聚合:
SELECT client, template, COUNT(*)
FROM (SELECT doc.client, doc.template,
ROW_NUMBER() OVER (PARTITION BY doc.client, doc.template ORDER BY doc.client) - 1 as seqnum,
COUNT(*) OVER (PARTITION BY doc.client, doc.template) as cnt
FROM document doc
) d
GROUP BY doc.client, doc.template, floor(seqnum * n / cnt)
子查询枚举行。然后外部查询使用 MOD()
.
将行分成两组
您可以像下面这样使用 RCTE。 运行 此声明 原样 首先在最后一列中使用不同的值。这里的最大批量大小是 1000。
WITH
GRP_RESULT (client, template, count) AS
(
-- Place your SELECT ... GROUP BY here
-- instead of VALUES
VALUES
('a', 'temp_a', 4500)
, ('a', 'temp_b', 3001)
)
, T (client, template, count, max_batch_size) AS
(
SELECT client, template, count, 1000
FROM GRP_RESULT
UNION ALL
SELECT client, template, count - max_batch_size, max_batch_size
FROM T
WHERE count > max_batch_size
)
SELECT client, template, CASE WHEN count > max_batch_size THEN max_batch_size ELSE count END count
FROM T
ORDER BY client, template, count DESC
结果是:
|CLIENT|TEMPLATE|COUNT |
|------|--------|-----------|
|a |temp_a |1000 |
|a |temp_a |1000 |
|a |temp_a |1000 |
|a |temp_a |1000 |
|a |temp_a |500 |
|a |temp_b |1000 |
|a |temp_b |1000 |
|a |temp_b |1000 |
|a |temp_b |1 |
您可以在之后按照上面指定的方式放置您的 SELECT ... GROUP BY
声明以实现您的目标。
我想根据计数将分组依据的结果分成几行,但我不知道这是否可能。例如,如果我有这样的查询:
SELECT doc.client, doc.template, COUNT(doc) FROM document doc GROUP BY doc.client, doc.template
和一个包含以下数据的 table 文档:
ID | name | client | template
1 | doc_a | a | temp_a
2 | doc_b | a | temp_a
3 | doc_c | a | temp_a
4 | doc_d | a | temp_b
查询结果为:
client | template | count
a | temp_a | 3
a | temp_b | 1
但如果计数大于 2,我想将结果的一行分成两行或更多行:
client | template | count
a | temp_a | 2
a | temp_a | 1
a | temp_b | 1
在 SQL 中有没有办法做到这一点?
你可以使用window函数然后聚合:
SELECT client, template, COUNT(*)
FROM (SELECT doc.client, doc.template,
ROW_NUMBER() OVER (PARTITION BY doc.client, doc.template ORDER BY doc.client) - 1 as seqnum,
COUNT(*) OVER (PARTITION BY doc.client, doc.template) as cnt
FROM document doc
) d
GROUP BY doc.client, doc.template, floor(seqnum * n / cnt)
子查询枚举行。然后外部查询使用 MOD()
.
您可以像下面这样使用 RCTE。 运行 此声明 原样 首先在最后一列中使用不同的值。这里的最大批量大小是 1000。
WITH
GRP_RESULT (client, template, count) AS
(
-- Place your SELECT ... GROUP BY here
-- instead of VALUES
VALUES
('a', 'temp_a', 4500)
, ('a', 'temp_b', 3001)
)
, T (client, template, count, max_batch_size) AS
(
SELECT client, template, count, 1000
FROM GRP_RESULT
UNION ALL
SELECT client, template, count - max_batch_size, max_batch_size
FROM T
WHERE count > max_batch_size
)
SELECT client, template, CASE WHEN count > max_batch_size THEN max_batch_size ELSE count END count
FROM T
ORDER BY client, template, count DESC
结果是:
|CLIENT|TEMPLATE|COUNT |
|------|--------|-----------|
|a |temp_a |1000 |
|a |temp_a |1000 |
|a |temp_a |1000 |
|a |temp_a |1000 |
|a |temp_a |500 |
|a |temp_b |1000 |
|a |temp_b |1000 |
|a |temp_b |1000 |
|a |temp_b |1 |
您可以在之后按照上面指定的方式放置您的 SELECT ... GROUP BY
声明以实现您的目标。