為了簡化我正在處理的復雜查詢,我覺得解決這個問題是關鍵。
我有下表
| ID | 城市 | 物品 |
|---|---|---|
| 1 | 芝加哥 | 1 |
| 2 | 芝加哥 | 2 |
| 3 | 芝加哥 | 1 |
| 4 | 雪松 | 2 |
| 5 | 雪松 | 1 |
| 6 | 雪松 | 2 |
| 7 | 底特律 | 1 |
我試圖找到按城市和專案分組的行數與僅按每個唯一城市專案對的專案分組的行數的比率。
所以我想要這樣的東西
| 城市 | 物品 | groupCityItemCount | 組項計數 | 比率 |
|---|---|---|---|---|
| 芝加哥 | 1 | 2 | 4 | 2/4 |
| 芝加哥 | 2 | 1 | 3 | 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替換了where并且have但這也很慢。
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)
(編輯:xQbert 和 MatBailie 指出的錯別字)
uj5u.com熱心網友回復:
是不是很慢,因為它在 select 陳述句中使用子查詢單獨評估每一行?它可以作為相關子查詢運行。
如果是這種情況,如果您從連接中獲取值并從那里開始,可能會更快 -
Select city, t1.item, (COUNT(t1.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, t1.item
更新了一些錯誤并包含了基于 xQbert 起點的小提琴。我不得不將 CAST 作為浮動在小提琴中,但您可能不需要 CAST 并根據資料型別在您的查詢中使用上述查詢。
我相信這符合您原始查詢的意圖。
https://dbfiddle.uk/?rdbms=postgres_13&fiddle=d77a715175159304b9192a16ad903347
uj5u.com熱心網友回復:
你可以分兩部分來處理它。
首先,像往常一樣聚合到您感興趣的級別。
然后,使用分析函式計算您的磁區(在您的情況下為 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 借來的小提琴
- https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=730146262267412522f6e27796151f43
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/382372.html
