【问题标题】:Over clause in SQL ServerSQL Server 中的 over 子句
【发布时间】:2012-12-19 06:31:31
【问题描述】:

我有以下问题

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'

我返回的结果集看起来像

您可以看到,虽然实际上在 2008 年 10 月 17 日和 2009 年 1 月 15 日之间为第二个查询返回了五行,但只有三个唯一名称。我尝试了各种修改 over 子句的方法,但都具有不同程度的不成功。如何更改我的查询,以便仅在为每一行指定的时间范围内找到唯一drugNames?

【问题讨论】:

  • 请解释您的第二个查询与您的第一个查询有何关联。并且请扩展您的问题“我如何更改我的查询...” - 您需要与 drugName 一起选择哪些其他列,以及您如何确定应该在每个唯一的 drugName 旁边显示哪个 clmid(例如)? (我假设您不想要“从 rx where patid=xxx ..... 中选择不同的药物名称”之类的简单内容!)
  • 第二个查询与第一个查询相关,因为它是表中的实际数据。您可以看到第二个查询中有五行。这五行对应于第一个屏幕截图中的distinctFamilies 列。但是,您可以看到,实际上只有三个独特的药物名称。
  • 如果你在 oracle count(distinct fieldname1) over(partition by fieldname2) 可以解决你的问题。但是 sqlserver8 会给你一个“count(distinct fieldname)”的错误,所以你必须在这里尝试不同的方法。
  • @Saju 我知道,这就是我要问的 :)

标签: sql sql-server sql-server-2008 tsql analytic-functions


【解决方案1】:

试一试:

   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 是否真的有必要 - 因为你已经使用它了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2010-11-08
    • 2017-12-27
    相关资源
    最近更新 更多