2011-03-01 3 views
4

문제는 주어진 행의 전후에 총 행 수를 얻는 것입니다 (예 : 기본 키로 식별).SQL : 주어진 행의 전후 행

T-SQL (MSSQL 2008)에서 다음을 시도해 보았습니다. 그것은 올바른 결과를주고 있지만 이것이 최선의 방법인지는 모르겠습니다.

;WITH cte_before AS 
(
    SELECT ROW_NUMBER() OVER (Order By CustomerId) [Row Number], customerid, 
      firstName 
    FROM SalesLT.Customer 
), 
cte_nums AS 
(
    SELECT ROW_NUMBER() OVER (Order By CustomerId) [Row Number1] 
    FROM SalesLT.Customer 
) 
SELECT [Row Number]-1 [before], MAX([Row Number1]) - [Row Number] 
     , CustomerID, FirstName 
FROM cte_nums, cte_before 
GROUP BY [Row Number], CustomerID, FirstName 
HAVING CustomerID = 55 

우리는 어떻게 T-SQL에서 그것을 향상시킬 수있는 방법은 우리가

+0

그 성명서는'['quote 문자의 비표준 사용으로 인해 다른 DBMS와 함께 실행되지 않을 것이다. 따옴표를 사용하거나 표준'''문자를 사용해야하는 열 이름을 사용하지 않으면 위의 명령문이 Oracle, PostgreSQL, DB2 (그리고 이후의 Firebird 3.0에서도 실행됩니다.) –

+0

예 @a_horse_with_no_name (it – TheVillageIdiot

답변

2

나는이 모든 방언으로 작동합니다 생각 : 필립의 같은

select 
    (select count(*) from SalesLT.Customer where customerid < 55) as rows_before, 
    (select count(*) from SalesLT.Customer where customerid > 55) as rows_after, 
    CustomerID, FirstName 
from SalesLT.Customer 
where CustomerID = 55 
0

향상된 SQL 버전 (오라클, MySQL은, SQLite는, 파이어 버드 등과 같은) 다른 SQL 언어와 서버에서 수행 할 수 있습니다

DECLARE @CustomerId int 

SET @CustomerId = 55 

SELECT 
    @CustomerId 
    ,ThisOne.FirstName 
    ,sum(case when Agg.CustomerId < @CustomerId then 1 else 0 end) [Before] 
    ,sum(case when Agg.CustomerId > @CustomerId then 1 else 0 end) [After] 
from SalesLT.Customer Agg 
    inner join SalesLT.Customer ThisOne 
    on ThisOne.CustomerId = @CustomerId 
+0

'group by'가 누락되었습니다. 자체 조인의 목적은 무엇입니까? –

+0

이 작업은 실행되지 않습니다. – TheVillageIdiot

+0

이 조인은 이름을 가져 오면 더 좋을 것입니다. 지정된 CustomerId의 FirstName (원래 결과 집합의 일부이기 때문에). 실행 여부와 관련하여 오류 메시지는 무엇입니까? 구문 오류에 대해 코드를 테스트 할 수있는 데이터 세트가 없었습니다. –

1

같은 생각하지만, 적절한 구현 그리고 테스트를 거쳤습니다. 이것은 재고 표준 ANSI SQL 만 사용합니다.

SELECT A.customerid, A.firstName, 
    count(case when B.customerid < A.customerid then 1 end) count_before, 
    count(case when B.customerid > A.customerid then 1 end) count_after 
FROM SalesLT.Customer A 
cross join SalesLT.Customer B 
where A.customerID=55 
GROUP BY A.customerid, A.firstName 

"A"별칭은 원하는 고객을 찾습니다 (55). B에 대한 조인은 각 고객에 대해 하나의 행을 생성하며, 각 행은 A.customerID에 대해 테스트됩니다.

케이스 절

  • 1 생성; 조건 < A.customerid는 [55]
  • Count 스킵 NULL 값을 만족하지 않는 경우 (AN ELSE 절없이 암시)
  • 널을 충족하므로 총 아웃 오른쪽

GROUP BY가 필요 오는 때 COUNT(), aggregate function을 사용한다.