簡體   English   中英

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

以及包含以下數據的表格文檔:

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          |

您可以在之后放置上面指定的SELECT ... GROUP BY語句以實現您的目標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM