[英]Optimal SQL to perform multiple aggregate functions with different group by fields
為了簡化我正在處理的復雜查詢,我覺得解決這個問題是關鍵。
我有下表
ID | 城市 | 物品 |
---|---|---|
1 | 芝加哥 | 1 |
2 | 芝加哥 | 2 |
3 | 芝加哥 | 1 |
4 | 雪松 | 2 |
5 | 雪松 | 1 |
6 | 雪松 | 2 |
7 | 底特律 | 1 |
我試圖找到按城市和項目分組的行數與僅按每個唯一城市項目對的項目分組的行數的比率。
所以我想要這樣的東西
城市 | 物品 | groupCityItemCount | groupItemCount | 比率 |
---|---|---|---|---|
芝加哥 | 1 | 2 | 3 | 2/3 |
芝加哥 | 2 | 1 | 4 | 1/3 |
雪松 | 1 | 1 | 4 | 1/4 |
雪松 | 2 | 2 | 3 | 2/3 |
底特律 | 1 | 1 | 4 | 1/4 |
這是我目前的解決方案,但它太慢了。
Select city, item, (count(*) / (select count(*) from records t2 where t1.item=t2.item)) AS pen_ratio
From records t1
Group By city, item
也用groupBy 和 have替換了where ,但這也很慢。
Select city, item, (count(*) / (select count(*) from records t2 group by item having t1.item=t2.item)) AS pen_ratio
From records t1
Group By city, item
(注意:我已經從解決方案中刪除了 column3 和 column4 以獲得更小的代碼)
它是否很慢,因為它使用 select 語句中的子查詢分別評估每一行? 它可能作為相關子查詢運行。
如果是這種情況,如果您從連接中獲取值並從那里獲取 go 可能會更快 -
Select city, item, (count(item) / MAX(t2.it_count)) AS pen_ratio
From records t1
JOIN (SELECT item, count(item) AS it_count
FROM records
group by item) t2
ON t2.item = t1.item
Group By city, item
您可以分兩部分處理它。
首先,像往常一樣聚合到您感興趣的級別。
然后,使用分析函數計算出分區的小計(項目,在您的情況下)。
WITH
aggregate AS
(
SELECT
city,
item,
COUNT(*) AS row_count
FROM
records
GROUP BY
city,
item
)
SELECT
city,
item,
row_count AS groupCityItemCount,
SUM(row_count) OVER (PARTITION BY item) AS groupItemCount
FROM
aggregate
從 xQbert 借來的小提琴
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.