2013-01-04 4 views
3

I enter image description hereSQL Server의 절 이상

과 같이 결과를 다음 쿼리

select * from 
(
     SELECT distinct 
     rx.patid 
     ,rx.fillDate 
     ,rx.scriptEndDate 
     ,MAX(datediff(day, rx.filldate, rx.scriptenddate)) AS longestScript 
     ,rx.drugClass 
     ,COUNT(rx.drugName) over(partition by rx.patid,rx.fillDate,rx.drugclass) as distinctFamilies 
     FROM [I 3 SCI control].dbo.rx 
     where rx.drugClass in ('h3a','h6h','h4b','h2f','h2s','j7c','h2e') 
     GROUP BY rx.patid, rx.fillDate, rx.scriptEndDate,rx.drugName,rx.drugClass 

) r 
order by distinctFamilies desc 

이 테이블에서 두 날짜 사이의 patID이되어야한다는 것을 의미한다이 5 고유 한 약물 이름. 나는 다음과 같은 쿼리를 실행할 때, :

select distinct * 
    from rx 
    where patid = 1358801781 and fillDate between '2008-10-17' and '2008-11-16' and drugClass='H4B' 

을 나는 결과 세트 당신은 사실이있는 동안 다섯 개 행이 두 번째 쿼리에 대해 반환 된 것을 볼 수 있습니다

enter image description here

처럼 그 보이는 돌아왔다 2008-10-17과 2009-01-15 사이에는 3 개의 고유 한 이름 만 있습니다. 저는 over 절을 수정하는 다양한 방법을 시도했습니다. 모두 다른 레벨의 성공하지 못했습니다. 각 행에 대해 지정된 시간 내에 고유 drugName 만 고유하도록 쿼리를 변경하려면 어떻게해야합니까?

+0

두 번째 쿼리가 첫 번째 쿼리와 어떻게 관련되는지 설명하십시오. "내 검색어를 어떻게 바꿀 수 있습니까?"라는 질문을 펼치십시오. - drugName과 함께 다른 열을 선택해야하며, 고유 한 drugName과 함께 표시되어야하는 clmid (예)를 어떻게 결정합니까? (나는 당신이 "단순한 drugName을 rx에서 patid = xxx .....와 같이 선택하는 것을 원하지 않는다고 가정하고있다!") –

+0

두 번째 쿼리는 테이블의 ACTUAL 데이터이기 때문에 첫 번째 쿼리와 관련이 있습니다. 두 번째 쿼리에는 다섯 개의 행이 있음을 알 수 있습니다. 이 다섯 행은 첫 번째 화면 캡의 'distinctFamilies'열에 해당합니다. 그러나 실제로는 세 가지 고유 한 약물 이름 만 있음을 알 수 있습니다. – wootscootinboogie

+0

당신이 oracle'count (distinct fieldname1) 이상 (fieldname2에 의한 파티션)'에 있다면 당신의 문제를 해결할 수있었습니다. 그러나 sqlserver8은 'count (distinct fieldname)'에 대한 오류를 줄 것이므로 여기에서 다른 접근 방식을 시도해야합니다. – Saju

답변

3

그것을 총을 복용은 : DISTINCT 정말 필요한 경우

SELECT DISTINCT 
    patid, 
    fillDate, 
    scriptEndDate, 
    MAX(DATEDIFF(day, fillDate, scriptEndDate)) AS longestScript, 
    drugClass, 
    MAX(rn) OVER(PARTITION BY patid, fillDate, drugClass) as distinctFamilies 
FROM (
    SELECT patid, fillDate, scriptEndDate, drugClass,rx.drugName, 
    DENSE_RANK() OVER(PARTITION BY patid, fillDate, drugClass ORDER BY drugName) as rn 
    FROM [I 3 SCI control].dbo.rx 
    WHERE drugClass IN ('h3a','h6h','h4b','h2f','h2s','j7c','h2e') 
)x 
GROUP BY x.patid, x.fillDate, x.scriptEndDate,x.drugName,x.drugClass,x.rn 
ORDER BY distinctFamilies DESC 

확실하지가 - 당신이 그것을 사용한 적이 있기 때문에 그것을에서 떠났다.