Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Kolejność znajdowania TSQL, która wystąpiła w ciągu 3 kolejnych miesięcy

Edytuj: Usunąłem lub MAX() OVER (PARTITION BY ...) ponieważ wydawało się to zabijać wydajność.

;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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego klauzula „Top” może prowadzić do długotrwałych kosztów

  2. SQL Server:Awaria łącza komunikacyjnego Wymagany SSL (nie udało się odebrać pakietu)

  3. jak agregować wartości z obrotu?

  4. Porządkowanie wierszy nadrzędnych według daty malejąco z wierszami podrzędnymi uporządkowanymi niezależnie pod każdym

  5. Jak naprawić błąd „funkcja datediff spowodowała przepełnienie” w SQL Server