簡體   English   中英

優化 SQL 以執行具有不同分組字段的多個聚合函數

[英]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.

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