sql >> Databasteknik >  >> RDS >> Sqlserver

TSQL Finding Order som inträffade under 3 månader i följd

Redigera: Bli kvitt eller MAX() OVER (PARTITION BY ...) eftersom det verkade döda prestanda.

;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. Hur man felsöker en burk på distans från netbeans

  2. Skapa index på json-fältet i PostgreSQL 9.2

  3. Butikslösenord är ok i php Sessionsvariabel?

  4. psycopg2.ProgrammingError på Enum-typ i Flask (databas) databasmigrering