基于计数的分组的SQL DB2拆分结果
我想根据计数将分组结果分成几行,但我不知道这是否可行。例如,如果我有这样一个查询:基于计数的分组的SQL DB2拆分结果,sql,db2,Sql,Db2,我想根据计数将分组结果分成几行,但我不知道这是否可行。例如,如果我有这样一个查询: SELECT doc.client, doc.template, COUNT(doc) FROM document doc GROUP BY doc.client, doc.template 以及包含以下数据的表格文档: ID | name | client | template 1 | doc_a | a | temp_a 2 | doc_b | a | temp_a 3 | do
SELECT doc.client, doc.template, COUNT(doc) FROM document doc GROUP BY doc.client, doc.template
以及包含以下数据的表格文档:
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中有这样做的方法吗?您可以使用窗口函数,然后聚合:
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 |
您可以放置
选择。。。按照上述规定分组,以实现您的目标。谢谢!它也会分裂成三,四,五?例如,如果我有一个计数为20的结果,那么我需要将它除以10rows@Minemosynne . . . 是的,您可以将2
更改为您想要的最大大小。很抱歉,我在帖子中解释我的问题时出错(我已更正帖子)。我不能让计数大于某个数字,如果计数大于该数字,则应将其拆分为几行。例如,假设计数的最大值为5,如果我的计数为7,我希望有2行(5和2)。如果数到20,将有4行(5、5、5和5),等等@minemosyne。这就是这个答案的作用。当我尝试它时,计数为89,而不是返回45行,最后一行的计数为2和1,我有两行,每行的计数分别为45和44