sql >> Database >  >> RDS >> Sqlserver

TSQL Bestelling vinden die in 3 opeenvolgende maanden heeft plaatsgevonden

Bewerken: Weggedaan of de MAX() OVER (PARTITION BY ...) omdat dat de prestaties leek te doden.

;WITH cte AS ( 
SELECT    CustID  ,
          OrderDate,
          DATEPART(YEAR, OrderDate)*12 + DATEPART(MONTH, OrderDate) AS YM
 FROM     Orders
 ),
 cte1 AS ( 
SELECT    CustID  ,
          OrderDate,
          YM,
          YM - DENSE_RANK() OVER (PARTITION BY CustID ORDER BY YM) AS G
 FROM     cte
 ),
 cte2 As
 (
 SELECT CustID  ,
          MIN(OrderDate) AS Mn,
          MAX(OrderDate) AS Mx
 FROM cte1
GROUP BY CustID, G
HAVING MAX(YM)-MIN(YM) >=2 
 )
SELECT     c.CustName, o.OrderDate, YEAR(o.OrderDate) AS YEAR
FROM         Customers AS c INNER JOIN
                      Orders AS o ON c.CustID = o.CustID
INNER JOIN  cte2 c2 ON c2.CustID = o.CustID and o.OrderDate between Mn and Mx
order by c.CustName, o.OrderDate


  1. Vervangen in querysyntaxis

  2. MySQL LEFT OUTER JOIN heeft een probleem met de eindresultaten

  3. Haal een record op op de maximale datum van elke maand

  4. Draaien met dynamische kolommen in Oracle