這不起作用:
select count(distinct colA, colB) from mytable
我知道我可以通過進行雙重選擇來簡單地解決這個問題。
select count(*) from (
select distinct colA, colB from mytable
)
無論如何,我可以在不必進行子選擇的情況下做到這一點嗎?
uj5u.com熱心網友回復:
子查詢也是我推薦的標準解決方案。除了在出現危險字符時容易出錯之外,基于串聯的解決方案的性能也可能更差。
注意:如果你收集了如何避免子查詢的晦澀的解決方案,這里也可以使用視窗函式(不要在生產中使用- 你的代碼審查員不會因此稱贊你):
select distinct count(*) over ()
from my_table
group by colA, colB
uj5u.com熱心網友回復:
[TL;DR] 只需使用子查詢。
如果您嘗試使用串聯,那么您需要確保使用永遠不會出現在值中的字串來分隔術語,否則您會發現分組在一起的非不同術語。
例如:如果您有兩個數字列,則 usingCOUNT(DISTINCT col1 || col2)將組合在一起1||23并將12||3它們計為一組。
您可以使用COUNT(DISTINCT col1 || '-' || col2)但如果列是字串值并且您有'ab-'||'-'||'c','ab'||'-'||'-c'然后再次連接后它們將相同。
最簡單的方法是使用子查詢。
如果你不能這樣做,那么你可以通過字串連接來組合列,但你需要分析列的內容并選擇一個沒有出現在你的字串中的分隔符,否則你的結果可能是錯誤的。更好的是確保分隔符永遠不會出現在帶有檢查約束的子字串中。
ALTER TABLE mytable ADD CONSTRAINT mytable__col1__chk CHECK (col1 NOT LIKE '%?%');
ALTER TABLE mytable ADD CONSTRAINT mytable__col2__chk CHECK (col2 NOT LIKE '%?%');
然后:
SELECT COUNT(DISTINCT col1 || '?' || col2)
FROM mytable;
uj5u.com熱心網友回復:
只是為了好玩,您可以(ab)使用視窗函式和限制子句。這些在分組后進行評估。所以:
SELECT COUNT(*) OVER()
FROM t
GROUP BY col_a, col_b
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
uj5u.com熱心網友回復:
如果您想不惜一切代價避免子選擇,一種變體是將它們連接起來:
SELECT count(DISTINCT concat(colA, colB)) FROM mytable;
uj5u.com熱心網友回復:
連接它們。
Select count(distinct colA ||'-'|| colB) from mytable;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/349015.html
