2013-10-22 341 views
1

我正在嘗試創建一個查詢,該查詢只返回一週內有三個或更多訂單的對象,並且僅在9/1/13之後提交訂單。協助創建SQL查詢

SELECT OrderID, DateSubmitted, ObjectID = i.ObjectID 
FROM dbo.Object i 
JOIN dbo.Order j 
ON i.ObjectID = j.ObjectID 
WHERE DateSubmitted >= '9/1/2013' 

我只是無法弄清楚如何將結果縮小到一週內有三個或更多訂單的對象。我試過很多GROUP BYHAVING子句,但沒有運氣。任何幫助將不勝感激。

+1

請更好 「在一個星期的時間內三個或更多的訂單」 定義。你的意思是任何7天的時間?週日到週六?星期一到星期五?本星期?如果你的開始日期在一週之內呢? –

+0

@Joel,如果我沒有讓自己變得複雜,那麼這意味着它是一個滑動窗口計算。類似於查看給定值n檢查n,n + 1和n + 2是否是周範圍。例如,如果訂單日期是10/01,10/03,10/08,10/09,那麼通過查看10/01下一個2日期不會在周範圍內,因此10/01將不符合要求的ObjectID-1。現在看10/03下兩個值是週日期範圍,這就是爲什麼object-1應該在結果集中。 –

+0

因此,任何七天計爲一週?那麼10/10,10/10和10/7的訂單可能會在一週內達到三個,另外10/3,10/4和10/9的另一個對象ID訂單也會計數? –

回答

0

根據您的最新評論,您查找的查詢非常簡單。使用DatePart函數並找出該對象的訂單日期的WEEK。檢查下面的查詢。除非您的數據庫已默認配置,否則Sunday(int 7)是SQL Server中設置的第一天。所以你爲了這個查詢目的需要設置Monday(int 1)作爲Week的第一天。 你可以通過執行SELECT @@DATEFIRST

檢查當前的設置,如果相同的對象有地方3次以上低於查詢多個星期在返回的每個星期的那個對象。如果只需要對象,則可以從結果集中跳過weekNumber並執行Distinct ObjectID。

不要忘記在結束時將DATEFIRST設置重置爲其原始值。

DECLARE @Object TABLE 
    (
     objectID  INT 
    ) 
    DECLARE @Order TABLE 
    (
     orderID   INT 
     ,objectID  INT 
     ,DateSubmitted DATE  
    ) 

    INSERT INTO @Object(objectID) 
    SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 

    INSERT INTO @Order (orderID, objectID, DateSubmitted) 
       SELECT 1,1,'10/2/2013' 
    UNION ALL SELECT 2,1,'10/3/2013' 
    UNION ALL SELECT 3,1,'10/5/2013' 

    UNION ALL SELECT 4,1,'10/09/2013' 
    UNION ALL SELECT 5,1,'10/10/2013' 
    UNION ALL SELECT 6,1,'10/13/2013' 

    UNION ALL SELECT 4,2,'10/15/2013' 
    UNION ALL SELECT 5,2,'10/16/2013' 
    UNION ALL SELECT 6,2,'10/21/2013' 

    UNION ALL SELECT 7,3,'09/02/2013' 
    UNION ALL SELECT 8,3,'09/03/2013' 
    UNION ALL SELECT 9,3,'09/04/2013' 




    DECLARE @CurrentDateFirst [email protected]@DATEFIRST 
    SET DATEFIRST 1; 
    SELECT i.objectID,DATEPART(week,DateSubmitted) AS weekNumber 
    FROM @Object i 
    JOIN @Order j 
    ON i.ObjectID = j.ObjectID 
    WHERE DateSubmitted >= '9/1/2013' 
    GROUP BY i.objectID,DATEPART(week,DateSubmitted) 
    HAVING(COUNT(DISTINCT orderID) >= 3) 
    ORDER BY i.objectID 
    SET DATEFIRST @CurrentDateFirst 

enter image description here

1

嘗試:

SELECT ObjectID 
FROM dbo.Object i 
JOIN dbo.Order j ON J.ObjectID = i.ObjectID 
WHERE DateSubmitted >= '9/1/2013' 
GROUP BY ObjectID 
HAVING COUNT(1) >=3 
1

不知道,但我需要在表上 最好的猜測是在SQL

SELECT count(OrderID), i.ObjectID 
FROM dbo.Object i 
JOIN dbo.Order j 
ON i.ObjectID = j.ObjectID 
group by i.ObjectID 
having DateSubmitted >= '9/1/2013' and count(OrderID)>2 
+0

這是否檢查DateSubmitted是否在星期範圍內? –

0

令人費解的詳細信息,但我認爲這會得到你想要的東西.. 。

With WeekSets As 
(
     Select i.ObjectID, 
       j.DateSubmitted, 
       j2.OrderID 
     From dbo.Object i 
     JOIN dbo.Order j 
       ON i.ObjectID = j.ObjectID 
     JOIN dbo.Order j2 
       On j.DateSubmitted <= j2.DateSubmitted 
       And j2.DateSubmitted < DateAdd(Day,7,j.DateSubmitted) 
       And j.ObjectID = j2.ObjectID 
     WHERE j.DateSubmitted >= '9/1/2013' 
),  GroupsOfThree As 
(
     Select ObjectID, 
       DateSubmitted 
     From WeekSets 
     Group By ObjectID, 
        DateSubmitted 
     Having Count(OrderID) >= 3 
) 
Select Distinct j.OrderID, 
     j.DateSubmitted, 
     w.ObjectID 
From GroupsOfThree g 
Join WeekSets w 
     On g.ObjectID = w.ObjectID 
     And g.DateSubmitted = w.DateSubmitted 
Join dbo.Order j 
     On w.ObjectID = j.ObjectID 
     And w.OrderID = j.OrderID 
+0

第一個CTE在與ObjectID相關的eachother的一個星期內識別OrderID。第二個CTE查看周集,並確定哪些在本週時間段內至少有三個訂單。最後,查詢使用來自第二個CTE的ad-hoc密鑰,將我們的星期集設置爲只有三個或更多的星期集,然後再加入dbo.Order以獲取已識別的訂單詳細信息。由於10/1,10/2,10/3和10/8的訂單對於10/2和10/3都有重疊的週期範圍,所以用於區分重複。 1,2,3爲一套2,3,8爲另一套。 –

+0

@AnupShah我很好奇聽到你對這種方法考慮這周的看法。 –

+0

我沒有時間檢查所有用例,但事實證明,OP比我想象的要簡單。但是如果它覆蓋滾動窗口,那麼還是要指出一點。 –