[英]MYSQL sum() for distinct rows
我正在尋找在我的 SQL 查詢中使用 sum() 的幫助:
SELECT links.id,
count(DISTINCT stats.id) as clicks,
count(DISTINCT conversions.id) as conversions,
sum(conversions.value) as conversion_value
FROM links
LEFT OUTER JOIN stats ON links.id = stats.parent_id
LEFT OUTER JOIN conversions ON links.id = conversions.link_id
GROUP BY links.id
ORDER BY links.created desc;
我使用DISTINCT
是因為我正在做“分組依據”,這確保了同一行不會被多次計算。
問題是 SUM(conversions.value) 不止一次計算每一行的“值”(由於 group by)
我基本上想為每個 DISTINCT conversions.id 做SUM(conversions.value)
。
那可能嗎?
我可能錯了,但據我了解
因此,對於每個conversions.id,您最多有一個links.id 受到影響。
您的要求有點像做 2 套笛卡爾積:
[clicks]
SELECT *
FROM links
LEFT OUTER JOIN stats ON links.id = stats.parent_id
[conversions]
SELECT *
FROM links
LEFT OUTER JOIN conversions ON links.id = conversions.link_id
對於每個鏈接,您會得到 sizeof([clicks]) x sizeof([conversions]) 行
正如您所指出的,您的請求中的唯一轉換次數可以通過
count(distinct conversions.id) = sizeof([conversions])
這個 distinct 設法刪除笛卡爾積中的所有 [clicks] 行
但很明顯
sum(conversions.value) = sum([conversions].value) * sizeof([clicks])
在你的情況下,因為
count(*) = sizeof([clicks]) x sizeof([conversions])
count(*) = sizeof([clicks]) x count(distinct conversions.id)
你有
sizeof([clicks]) = count(*)/count(distinct conversions.id)
所以我會用
SELECT links.id,
count(DISTINCT stats.id) as clicks,
count(DISTINCT conversions.id) as conversions,
sum(conversions.value)*count(DISTINCT conversions.id)/count(*) as conversion_value
FROM links
LEFT OUTER JOIN stats ON links.id = stats.parent_id
LEFT OUTER JOIN conversions ON links.id = conversions.link_id
GROUP BY links.id
ORDER BY links.created desc;
讓我張貼! 傑羅姆
Jeromes 解決方案實際上是錯誤的,可能會產生不正確的結果!!
sum(conversions.value)*count(DISTINCT conversions.id)/count(*) as conversion_value
讓我們假設下表
conversions
id value
1 5
1 5
1 5
2 2
3 1
不同 id 的正確值總和為 8。 Jerome 的公式產生:
sum(conversions.value) = 18
count(distinct conversions.id) = 3
count(*) = 5
18*3/5 = 9.6 != 8
有關您看到錯誤數字的原因的解釋, 請閱讀此內容。
我認為傑羅姆可以處理導致您錯誤的原因。 Bryson 的查詢可以工作,盡管在 SELECT 中使用該子查詢可能效率低下。
使用以下查詢:
SELECT links.id
, (
SELECT COUNT(*)
FROM stats
WHERE links.id = stats.parent_id
) AS clicks
, conversions.conversions
, conversions.conversion_value
FROM links
LEFT JOIN (
SELECT link_id
, COUNT(id) AS conversions
, SUM(conversions.value) AS conversion_value
FROM conversions
GROUP BY link_id
) AS conversions ON links.id = conversions.link_id
ORDER BY links.created DESC
我使用子查詢來做到這一點。 它消除了分組問題。 所以查詢會是這樣的:
SELECT COUNT(DISTINCT conversions.id)
...
(SELECT SUM(conversions.value) FROM ....) AS Vals
像這樣的東西怎么樣:
select l.id, count(s.id) clicks, count(c.id) clicks, sum(c.value) conversion_value
from (SELECT l.id id, l.created created,
s.id clicks,
c.id conversions,
max(c.value) conversion_value
FROM links l
LEFT JOIN stats s ON l.id = s.parent_id
LEFT JOIN conversions c ON l.id = c.link_id
GROUP BY l.id, l.created, s.id, c.id) t
order by t.created
這可以解決問題,只需將總和除以重復的對話 id 的計數。
SELECT a.id,
a.clicks,
SUM(a.conversion_value/a.conversions) AS conversion_value,
a.conversions
FROM (SELECT links.id,
COUNT(DISTINCT stats.id) AS clicks,
COUNT(conversions.id) AS conversions,
SUM(conversions.value) AS conversion_value
FROM links
LEFT OUTER JOIN stats ON links.id = stats.parent_id
LEFT OUTER JOIN conversions ON links.id = conversions.link_id
GROUP BY conversions.id,links.id
ORDER BY links.created DESC) AS a
GROUP BY a.id
Select sum(x.value) as conversion_value,count(x.clicks),count(x.conversions)
FROM
(SELECT links.id,
count(DISTINCT stats.id) as clicks,
count(DISTINCT conversions.id) as conversions,
conversions.value,
FROM links
LEFT OUTER JOIN stats ON links.id = stats.parent_id
LEFT OUTER JOIN conversions ON links.id = conversions.link_id
GROUP BY conversions.id) x
GROUP BY x.id
ORDER BY x.created desc;
我相信這會給你你正在尋找的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.