2010-11-23 2 views
0

본인은 현재 주문SQL Server의 각 그룹 내에서 TOP (1) 행을 얻는 방법 2000

PK_PatientId PK_PatientVisitId PK_VisitProcedureId DateSort 
------------ ----------------- ------------------- ----------------------- 
1   4     4     2009-06-22 00:00:00.000 
1   3     3     2009-06-22 00:00:00.000 
1   2     2     2010-03-11 00:00:00.000 
1   1     1     2010-03-11 00:00:00.000 
5   6     6     2009-05-24 00:00:00.000 
5   5     5     2009-11-07 00:00:00.000 
7   7     7     2009-05-24 00:00:00.000 
8   8     8     2009-05-24 00:00:00.000 
9   9     9     2009-05-24 00:00:00.000 
10   10    10     2009-05-24 00:00:00.000 

쿼리를 기반으로 각 PK_PatientId에 대해 최고 1 행을 선택하려는 데이터의 일부 다음 세트가 이 결과는

SELECT  
    P.PK_PatientId 
    , PV.PK_PatientVisitId 
    , MAX(TVP.PK_VisitProcedureId) AS PK_VisitProcedureId 
    , MAX(PV.LastUpdated) AS DateSort 
    --, Row_Number() OVER (Partition BY PK_PatientId ORDER BY PV.PK_PatientVisitId DESC) AS RowNo 
FROM   
    dbo.M_Patient AS P 
     INNER JOIN 
    dbo.M_PatientVisit AS PV 
      ON 
       P.PK_PatientId = PV.FK_PatientId 
     INNER JOIN 
    dbo.TX_VisitProcedure AS TVP 
      ON 
       PV.PK_PatientVisitId = TVP.FK_PatientVisitId 
WHERE  
    (P.IsActive = 1) 
     AND 
    (PV.IsActive = 1) 
     AND 
    (TVP.IsActive = 1) 
GROUP BY 
    PK_PatientId 
    , PK_PatientVisitId 
ORDER BY 
    PK_PatientId 
    , PK_PatientVisitId DESC 

을하고 내가 RowNo = 1 복용하여 행 번호 기능을하고 있던 나머지 기능을 얻을 수있는 것을 저를지도한다. 그러나 이제는이 기능을 사용할 수 없기 때문에이 절차를 SQL 2000으로 가져 가야합니다.

원하는 결과는 SQL 2005 년 ROW_NUMBER를 사용할 때 내가 무엇입니까

PK_PatientId PK_PatientVisitId PK_VisitProcedureId DateSort    RowNo 
------------ ----------------- ------------------- ----------------------- -------------------- 
1   4     4     2009-06-22 00:00:00.000 1 
5   6     6     2009-05-24 00:00:00.000 1 
7   7     7     2009-05-24 00:00:00.000 1 
8   8     8     2009-05-24 00:00:00.000 1 
9   9     9     2009-05-24 00:00:00.000 1 

가 난 단지 SQL 2000 사용하여 같은 결과를 원하는 것입니다. "환자를 반환하는 쿼리가 발생할 것이다 ...

AND NOT EXISTS (
SELECT * 
FROM dbo.M_PatientVisit PV2 
WHERE P.PK_PatientId = PV2.FK_PatientId 
AND PV2.PK_PatientVisitId > PV.PK_PatientVisitId 
) 

:

나는 당신은 당신의 WHERE 절의 끝 부분이 스트랩 필요 SQL 2000

답변

1

을 사용해야합니다 ID가 더 높은 환자의 방문이없는 환자를위한 방문 "입니다. 즉 가장 높은 ID로 방문을하게됩니다. 당신이 비트가

+0

이렇게했습니다. 나는 그것에 대해 생각하지 않았다. 나는 그룹들 사이에서 TOP (1)에 집중했다. 내가 각 환자 그룹에서 TOP (1) 행을 얻는 것을 생각할 때. 그러나 그것은 좋은 일을했습니다. –

+0

분명히이 하위 쿼리에 포함 된 다른 모든 조건이 필요합니다. 그렇지 않으면 이후에 "활성"이 아닌 방문을 선택할 수 있습니다. –

+0

@Damien - 게시 한 시간 전후에 해당 게시물을 편집했습니다. - 감사합니다. –

0

당신이 당신의 프로 시저에서 임시 테이블을 사용시겠습니까 등이 활성화되어 있는지 확인하기 위해이 하위 쿼리의 WHERE 절에있는 다른 논리를 포함해야합니다

주? 즉, 임시 테이블에 max (PatientVisitId) 행을 삽입 할 수 있습니다.

+0

그건 좋은 접근 방법이 아닙니다. 그렇게 할 수는 있지만 일이 조금 복잡해집니다. 윌의 대답을보십시오. 그것은 효과가 있었다. 아직은 질문이 열려 있습니다. 내가 생각하기에 그것은 다른 기술들에 의해서도 해결 될 수도 있습니다. –

관련 문제