3

私は次のクエリを持っています

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

次のような結果が得られます ここに画像の説明を入力してください

これは、テーブル内の2つの日付の間に、5つの一意の薬剤名が必要であることを示すpatIDを意味するはずです。ただし、次のクエリを実行すると、次のようになります。

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

次のような結果セットが返されます

ここに画像の説明を入力してください

実際、2008-10-17と2009-01-15の日付の間の2番目のクエリに対して5つの行が返されますが、一意の名前は3つしかないことがわかります。私はover句を変更するさまざまな方法を試しましたが、すべて失敗のレベルが異なります。各行に指定された時間枠内で一意 のをのみ検索するようにクエリを変更するにはどうすればよいですか?drugName

4

1 に答える 1

3

それを撃つ:

   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

DISTINCTが本当に必要かどうかわからない-使用したのでそのままにしておきます。

于 2013-01-04T20:40:03.240 に答える