2013-09-04 4 views
0
id refid date1 date2  nextdate 
5 10 2008-02-21 2009-02-21 004/2008 
6 10 2009-02-09 2010-02-09 002/2009 
7 10 2010-02-08 2011-02-08 001/2010 
10 11 2007-02-15 2008-02-15 002/2007 
11 11 2008-02-21 2009-02-21 001/2008 
12 11 2009-02-09 2010-02-09 001/2009 
13 11 2010-02-09 2011-02-09 002/2010 
14 11 2011-07-19 2012-07-19 054/2011 
15 11 2012-07-17 2013-07-17 066/2012 
18 14 2007-02-15 2008-02-15 006/2007 
25 16 2007-02-15 2008-02-15 004/2007 
27 16 2009-02-10 2010-02-10 004/2009 
28 16 2010-02-12 2011-02-12 005/2010 
29 16 2011-07-26 2012-07-26 055/2011 
30 16 2012-07-18 2013-07-18 067/2012 

이 데이터 테이블이 있습니다. 다음과 같은 작업을 통해 데이터 테이블을 필터링해야합니다. refid에 4 개 이상의 동일한 값이있는 경우 첫 번째와 마지막 3이 필요합니다. 4보다 적은 refid valuses가 있으면 아무 것도 수행하지 않습니다. 결과는 다음과 같아야합니다.열별로 그룹화하고 각 그룹의 범위를 선택하십시오.

id refid date1 date2  nextdate 
5 10 2008-02-21 2009-02-21 004/2008 
6 10 2009-02-09 2010-02-09 002/2009 
7 10 2010-02-08 2011-02-08 001/2010 
10 11 2007-02-15 2008-02-15 002/2007 
13 11 2010-02-09 2011-02-09 002/2010 
14 11 2011-07-19 2012-07-19 054/2011 
15 11 2012-07-17 2013-07-17 066/2012 
18 14 2007-02-15 2008-02-15 006/2007 
25 16 2007-02-15 2008-02-15 004/2007 
28 16 2010-02-12 2011-02-12 005/2010 
29 16 2011-07-26 2012-07-26 055/2011 
30 16 2012-07-18 2013-07-18 067/2012 

어떻게 그렇게 할 수 있습니까?

+0

'Datatable'는 .NET 메모리'DataTable'을 의미? 그렇다면 어떤 언어를 사용하고 있습니까? 그렇지 않다면 어떤 rdbms를 사용하고 있습니까? 어쨌든, 어떻게 주문 하시겠습니까? –

+0

첫 번째 데이터 테이블은 내 쿼리에서 가져온 것입니다. 쿼리를 수정하여 원하는 결과를 얻고 싶습니다. 조건은 다음과 같습니다. refid에 4 개 이상의 동일한 값이있는 경우 첫 번째와 마지막 값이 필요합니다. 3. 4 개 이하의 refid valuses가없는 경우 아무 것도하지 마십시오. –

+0

SLQ 2008을 사용하고 첫 번째 datatable에 대해 쿼리를 사용합니다 MyTable에서 ID, refid, date1, date2, nextdate를 선택하십시오. –

답변

1

당신은에 ROW_NUMBER을 사용할 수있는 CTE :

WITH CTE AS(
    SELECT [id], [refid], [date1], [date2], [nextdate], 
    RN_ASC = ROW_NUMBER()OVER(
      PARTITION BY refid 
      ORDER BY id ASC), 
     RN_DESC = ROW_NUMBER()OVER(
      PARTITION BY refid 
      ORDER BY id DESC) 
    FROM dbo.MyTable 
) 
SELECT [id], [refid], [date1], [date2], [nextdate] 
FROM CTE 
WHERE RN_ASC = 1 OR RN_DESC <= 3 
ORDER BY [id] 

DEMO

Ranking Functions (Transact-SQL)

+0

감사합니다. Tim. 당신은 마법사입니다 :) –

관련 문제