2013-05-29 2 views
0

SQL Server 2008/2012입니다. 나는 당신이 TOP 사용할 때마다 항상 TOP 무엇을 반환하기 위해 ORDER BY를 사용해야 읽고 나는이SQL 교차 적용 TOP

-- Insert 5 future years 
SELECT TOP(5) V.CompanyId, V.StartDate, V.EndDate 
FROM #MonthTally T 
CROSS APPLY 
( 
SELECT 
    F.CompanyId, 
    DATEADD(YY, T.N,MAX(F.StartDate)) AS StartDate, 
    DATEADD(YY, T.N,MAX(F.EndDate)) AS EndDate 
    FROM FiscalPeriods F 
    GROUP BY CompanyId 
) V 

처럼 tallytable을 사용하고 #MonthTally

;WITH 
    Pass0 AS (SELECT 1 AS C UNION all SELECT 1), --2 rows 
    Pass1 AS (SELECT 1 AS C FROM Pass0 AS A, Pass0 AS B),--4 rows 
    Pass2 AS (SELECT 1 AS C FROM Pass1 AS A, Pass1 AS B),--16 rows 
    Pass3 AS (SELECT 1 AS C FROM Pass2 AS A, Pass2 AS B),--256 rows 
    Tally AS (SELECT ROW_NUMBER() OVER(ORDER BY C) AS N FROM Pass3) 
SELECT TOP 256 ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS N 
INTO #MonthTally 
FROM Tally 
ORDER BY N 

에 tallytable 있습니다. 따라서 #MonthTally에 데이터를 삽입하는 방법에 관계없이 ORDER BY를 사용하지 않는 한 SELECT TOP(5) * FROM #MonthTally을 항상 1에서 5까지 반환 할 수는 없습니다. 하지만 CROSS APPLY에 주문 방법을 어떻게 얻습니까?

더 나쁘지 않다면 교차 적용 외부에서 집계 할 수 있습니다. 어쨌든 GROUP BY에 대한 각 행의 성능이 좋지 않습니다. 그러나 나는 상관없이 알고 싶다.

답변

0

이 경우 나는 단지 WHERE N BETWEEN 1 AND 5을 사용합니다. 일반적으로

당신이

WITH T AS 
(
SELECT TOP(5) N 
FROM #MonthTally 
ORDER BY N 
) 
SELECT V.CompanyId, V.StartDate, V.EndDate 
FROM T 
CROSS APPLY 
( 
SELECT 
    F.CompanyId, 
    DATEADD(YY, T.N,MAX(F.StartDate)) AS StartDate, 
    DATEADD(YY, T.N,MAX(F.EndDate)) AS EndDate 
    FROM FiscalPeriods F 
    GROUP BY CompanyId 
) V 
ORDER BY T.N 
+0

TOP 감사합니다 사용하는 CTE를에 쿼리 또는 하위 쿼리를 넣을 수 있지만. 나는 1과 5 사이를 사용했다. – CodeMonkey