2013-07-24 56 views
-1

我有一個顧客名單和訂單日期,我想找到在30天內至少有兩個訂單的顧客。找到在30天內下單的顧客

例如,如果客戶12在2013年6月20日對一種產品訂購併在2013年7月1日再次訂購。我希望查詢帶回客戶12

感謝

+0

您是否嘗試過任何查詢? – Hariharan

+0

30天之內或30天之內? –

+0

在30天內彼此。 – Woodington

回答

0
SELECT 
    customerid, 
    count(*) 
FROM 
    orderTable 
WHERE 
    orderDate between <startDate> and <endDate> 
GROUP BY 
    customerid 
HAVING 
    count(*) >= 2 
+0

謝謝你的回答,但是有沒有辦法做到這一點,我有很多年的日期,並希望看到客戶在整個數據30天內返回。 – Woodington

1

像這樣的東西應該做你需要使用自加入什麼。您可能需要指數無論客戶標識符(在這種情況下customer_name

SELECT DISTINCT o1.customer_name 
FROM orders o1 
JOIN orders o2 
    ON o1.customer_name = o2.customer_name 
AND o1.id <> o2.id 
AND ABS(DATEDIFF(day, o1.order_date, o2.order_date)) < 30 

An SQLfiddle to test with

如果您正在運行SQL Server 2012,可能會(應該)提供更好的性能;

WITH cte AS (
    SELECT customer_name, order_date od1, 
     LAG(order_date) OVER (PARTITION BY customer_name ORDER BY order_date) od2 
    FROM orders 
) 
SELECT DISTINCT customer_name 
FROM cte 
WHERE DATEDIFF(day, od2, od1) < 30 

Another SQLfiddle

+0

這似乎是工作,我也有一個網站的來源,我想知道,如果客戶從同一網站訂購,具有相同的條件,例如客戶12從網站50訂購,在30天內2次。我可以在第一個答案中添加where子句嗎?再次感謝,對此感到抱歉。 – Woodington

+0

@Woodington應該爲條件添加'AND o1.site = o2.site'和類似的東西。我想你可能還想選擇o1.site和o1.conditions到字段列表來獲取它們。 –

+0

我必須找到源ID,我想過濾其他人,我在(1,6)中添加了a.source_id到最後,但這不能正常工作。 – Woodington

0
SELECT 
    customer_name, 
    COUNT(
     CASE WHEN datediff(dd, order_date, getdate()) 
      <=30 THEN 1 
     END 
    ) AS order_count 
FROM 
    order_table 
GROUP BY 
    customer_name