首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server中的Over子句

SQL Server中的Over子句
EN

Stack Overflow用户
提问于 2013-01-04 19:27:16
回答 1查看 2.5K关注 0票数 3

我有以下查询

代码语言:javascript
复制
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个唯一的药物名称。但是,当我运行以下查询时:

代码语言:javascript
复制
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之间的第二个查询实际上返回了五行,但只有三个唯一的名称。我尝试过各种修改over子句的方法,但都有不同程度的失败。如何更改我的查询,使我只能在为每一行指定的时间范围内找到唯一的drugName

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-04 20:40:03

尝试一下:

代码语言:javascript
复制
   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

不确定区分是否真的是必要的--因为你已经使用过它,所以把它留在里面。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14163585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档