基于计数的分组的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