2017-02-11 47 views
0

我正在使用Redshift數據庫,但我無法理解爲什麼我的連接或SUM帶來了太多的值。我的查詢是下面:SQL加入或SUM在使用Redshift數據庫時返回的值太多

SELECT 
    date(u.created_at) AS date, 
    count(distinct c.user_id) AS active_users, 
    sum(distinct insights.spend) AS fbcosts, 
    count(c.transaction_amount) AS share_shake_costs, 
    round(((sum(distinct insights.spend) + count(c.transaction_amount))/
    count(distinct c.user_id)),2) AS cac 
FROM 
    dbname.users AS u 
LEFT JOIN 
    dbname.card_transaction AS c ON c.user_id = u.id 
LEFT JOIN 
    facebookads.insights ON date(insights.date_start) = date(u.created_at) 
LEFT JOIN 
    dbname.card_transaction AS c2 ON date(c2.timestamp) = date(u.created_at) 
WHERE 
    c2.vendor_transaction_description ilike '%share%' 
    OR c2.vendor_transaction_description ilike '%shake to win%' 
GROUP BY 
    date 
ORDER BY 
    1 DESC; 

此查詢將返回以下數據:

Table data from query above

如果我們看一下2017年2月8日,我們可以看到一共有1298對「share_shake_costs」。但是,如果我只在card_transaction表上運行相同的查詢,則會得到以下正確的結果。

enter image description here

這第二個表的查詢看起來是這樣的:

SELECT 
    date(timestamp), 
    sum(transaction_amount) 
FROM 
    dbname.card_transaction AS c2 
WHERE 
    c2.vendor_transaction_description ilike '%share%' 
    OR c2.vendor_transaction_description ilike '%shake to win%' 
GROUP BY 
    1 
ORDER BY 
    1 DESC; 

我有一種感覺,我有一個類似的問題,我的「fbcosts」一欄。我認爲它必須處理我的連接,因爲SUM應該工作正常。

我是Redshift和SQL的新手,所以也許有更好的方法來完成整個查詢。有什麼明顯的我失蹤了?

+1

刪除表中的連接,直到找出哪個連接導致重複計數。 (可能有幾個) –

+0

這兩個查詢運行不同的聚合,因此可能不是很好的比較。請解釋模式或表關係(哪些是一對多?)。爲什麼在'users'上''LEFT JOIN dbname.card_transaction'兩次? – Parfait

+0

這些連接條件看起來很奇怪。似乎你說的交易的日期/時間必須等於用戶記錄的創建日期。奇。 – trincot

回答

0

看起來你有一個包含1:n映射的表,並且當你通過一個通用子句進行連接時,該數字將被計數n次。

讓我們說一個表,orders包含user_id和總bill_amount和另一個表order_details包含由該user_id放置的子項的詳細信息。

如果你做了左連接,顧名思義,orders.user_id將加入n次order_details.user_id,其中

n = total number of rows in order_details table 

,並會執行聚合(求和,計數等)ñ倍。

+------------------+   +----------------------+ 
|  orders  |   | order_details  | 
+------------------+   +----------------------+ 
|amount user_id |   | user_id  items | 
+------------------+   +----------------------+ 
| 1000  123 ---------> | 123   apple | 
       +    +----------------------+ 
       +-------------> | 123   guava | 
       |    +----------------------+ 
       v-------------> | 123   mango | 
           +----------------------+ 

select sum(amount) from orders o left join order_details od 
on o.user_id = od.user_id; // result: 3000 

select count(amount) from orders o left join order_details od 
on o.user_id = od.user_id; // result: 3 

我希望現在大計數原因很清楚你。 PS:另外,總是更喜歡在()中包含OR條件。

WHERE 
    (c2.vendor_transaction_description ilike '%share%' 
    OR c2.vendor_transaction_description ilike '%shake to win%')