2016-07-07 61 views
1

我花了相當多的時間試圖讓我的腦袋如何做到這一點,我不能。我爲自己做了很多複雜的事情,我理解代碼,而不是如何一起流動。如果客戶在特定日期上使用並返回,SQL重複計數?

如果我有表"Customers"與列"customer_id""store_id""visited""date" - 我想在設定的日期​​識別誰訪問客戶(visited = yes)特定商店(store_id="NEA") - 然後又回到了同一從那時起開始存儲,並計算返回的客戶數量 - 任何人都可以幫我解決問題嗎?

我知道我需要選擇customer_id對於那些誰擁有的"NEA"store_id的「2015年5月14日」的日期和「是」的訪問,但我怎麼然後確定誰回來了,數它們 - 那麼當天有多少客戶訪問過,然後返回?

因此,例如:

customer_id | store_id | date  | visited 

123    NEA  2015-05-14  yes 

456    NEA  2015-05-14  yes 

789    ABC  2015-05-16  no 

123    NEA  2015-05-14  yes 

654    TDF  2015-05-12  yes 

987    PEH  2015-05-14  yes 

123    NEA  2015-05-14  no 

456    NEA  2015-05-17  yes 

987    LEA  2015-05-14  yes 

159    NEA  2015-05-16  yes 

123    NEA  2015-05-19  yes 
+0

我再次更新了我的答案,q.v.第三個查詢。我希望這是你以後的樣子。 –

回答

0
SELECT DISTINCT customer_id, date 
FROM Customers 
WHERE visited = 'yes' 
GROUP BY customer_id, store_id, date 
HAVING COUNT(*) >= 2 

按照下面的運行演示的鏈接:

SQLFiddle

上面的查詢產生重複的客戶和日期的列表他們兩次或更多地訪問了同一家商店。如果你想通過日期重複客戶的數量,你可以用它和子查詢:

SELECT t.date, COUNT(*) AS duplicateCount 
FROM 
(
    SELECT DISTINCT customer_id, date 
    FROM Customers 
    WHERE visited = 'yes' 
    GROUP BY customer_id, store_id, date 
    HAVING COUNT(*) >= 2 
) t 
GROUP BY t.date 

SQLFiddle

更新:

根據您的意見,下面的查詢可能是你腦子裏想:

SELECT DISTINCT customer_id 
FROM Customers 
WHERE visited = 'yes' 
GROUP BY customer_id, store_id 
HAVING SUM(CASE WHEN date = '2015-05-14' THEN 1 ELSE 0 END) >= 1 AND 
     SUM(CASE WHEN date > '2015-05-14' THEN 1 ELSE 0 END) >= 1 
+0

感謝迄今爲止的傢伙 - 這對我有很大幫助,但是當我測試它時,這是不對的。我想知道2015-05-14有多少客戶進來(visited = yes,store_id = yes),然後回來了 - 這不是通過456客戶?我錯過了什麼嗎? – Fibob

+0

你應該向我們展示預期產量,以減少我們的猜測。那麼你想要什麼輸出? –

+0

我只是想要customer_id |重複客戶數 - 2015-05-14訪問過的人,然後回來。 – Fibob

0

或者是這樣的:

SELECT count(*) AS cnt,t.* 
FROM yourTable AS t 
WHERE 
    `date` = '2015-05-14' 
AND 
    store_id = 'NEA' 
AND 
    visited = 'YES' 
GROUP BY customer_id 
HAVING cnt >1;