Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 计算不同记录的窗口函数_Sql_Sql Server 2008_Tsql - Fatal编程技术网

Sql 计算不同记录的窗口函数

Sql 计算不同记录的窗口函数,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,下面的查询基于一个复杂的视图,该视图按我所希望的方式工作(我不打算包含该视图,因为我认为它对解决手头的问题没有帮助)。我搞不清楚的是drugCountsinFamilies列。我需要它来显示每个药物系列的不同药物名称的编号。您可以从第一个屏幕盖中看到有三个不同的H3A行。H3A的drugCountsInFamilies应为3(有三种不同的H3A药物。) 您可以从第二个屏幕帽中看到,第一个屏幕帽中的drugCountsInFamilies正在捕获药物名称所列的行数。 下面是我的问题,对不正确的

下面的查询基于一个复杂的视图,该视图按我所希望的方式工作(我不打算包含该视图,因为我认为它对解决手头的问题没有帮助)。我搞不清楚的是
drugCountsinFamilies
列。我需要它来显示每个药物系列的
不同药物名称的编号。您可以从第一个屏幕盖中看到有三个不同的H3A行。H3A的
drugCountsInFamilies
应为3(有三种不同的H3A药物。)

您可以从第二个屏幕帽中看到,第一个屏幕帽中的
drugCountsInFamilies
正在捕获药物名称所列的行数。

下面是我的问题,对不正确的部分进行了评论

select distinct
     rx.patid
    ,d2.fillDate
    ,d2.scriptEndDate
    ,rx.drugName
    ,rx.drugClass
    --the line directly below is the one that I can't figure out why it's wrong
    ,COUNT(rx.drugClass) over(partition by rx.patid,rx.drugclass,rx.drugname) as drugCountsInFamilies
from 
(
select 
    ROW_NUMBER() over(partition by d.patid order by d.patid,d.uniquedrugsintimeframe desc) as rn
    ,d.patid
    ,d.fillDate
    ,d.scriptEndDate
    ,d.uniqueDrugsInTimeFrame
    from DrugsPerTimeFrame as d
)d2
inner join rx on rx.patid = d2.patid
inner join DrugTable as dt on dt.drugClass=rx.drugClass
where d2.rn=1 and rx.fillDate between d2.fillDate and d2.scriptEndDate
and dt.drugClass in ('h3a','h6h','h4b','h2f','h2s','j7c','h2e')
order by rx.patid
如果我试图在
count(rx.drugClass)
子句中添加一个distinct,SSMS就会生气。可以使用窗口函数完成吗?

计数(不同)
作为窗口函数需要技巧。实际上,有好几个级别的技巧

因为您的请求实际上非常简单——值始终为1,因为rx.drugClass位于分区子句中——我将做一个假设。假设您要计算每个患者的独特药物类别数

如果是这样,请执行一个按patid和drugClass分区的
行编号()。当这个值为1时,在一个patid中,一个新的drugClass开始。创建一个标志,在本例中为1,在所有其他情况下为0

然后,您可以简单地使用一个分区子句进行一个
sum
,以获得不同值的数量

查询(格式化后以便我可以阅读)如下所示:

select rx.patid, d2.fillDate, d2.scriptEndDate, rx.drugName, rx.drugClass,
       SUM(IsFirstRowInGroup) over (partition by rx.patid) as NumDrugCount
from (select distinct rx.patid, d2.fillDate, d2.scriptEndDate, rx.drugName, rx.drugClass,
             (case when 1 = ROW_NUMBER() over (partition by rx.drugClass, rx.patid order by (select NULL))
                   then 1 else 0
              end) as IsFirstRowInGroup
      from (select ROW_NUMBER() over(partition by d.patid order by d.patid,d.uniquedrugsintimeframe desc) as rn, 
                   d.patid, d.fillDate, d.scriptEndDate, d.uniqueDrugsInTimeFrame
            from DrugsPerTimeFrame as d
           ) d2 inner join
           rx
           on rx.patid = d2.patid inner join
           DrugTable dt
           on dt.drugClass = rx.drugClass
      where d2.rn=1 and rx.fillDate between d2.fillDate and d2.scriptEndDate and
            dt.drugClass in ('h3a','h6h','h4b','h2f','h2s','j7c','h2e')
     ) t
order by patid

为什么这样的事情不起作用

SELECT 
   IDCol_1
  ,IDCol_2
  ,Count(*) Over(Partition By IDCol_1, IDCol_2 order by IDCol_1) as numDistinct
FROM Table_1

我遇到这个问题是为了寻找一个解决我计算不同值问题的方法。在寻找答案的过程中,我遇到了这个问题。见最后一条评论。我已经对它进行了测试并使用了SQL。这对我来说非常有效,我想我会在这里提供另一个解决方案

总之,使用
densite_RANK()
,对分组列进行
分区,并对列进行
排序,以进行计数:

DENSE_RANK() OVER (PARTITION BY drugClass ORDER BY drugName ASC) +
DENSE_RANK() OVER (PARTITION BY drugClass ORDER BY drugName DESC) - 1 AS drugCountsInFamilies
我用这个作为自己的模板

DENSE_RANK() OVER (PARTITION BY PartitionByFields ORDER BY OrderByFields ASC ) +
DENSE_RANK() OVER (PARTITION BY PartitionByFields ORDER BY OrderByFields DESC) - 1 AS DistinctCount

我希望这有帮助

@littlebbytables我无法在(分区依据…)
上使用
计数(不同的rx.drugClass)
而不出错。@littlebbytables无法工作,因为我需要在同一个类中使用两种
不同的
药物。如果相同的drugName列出两次,它也在同一个类中,但我需要计算一次。您的请求没有意义,因为您在分区子句中有rx.drugClass。因此,
count(distinct rx.drugClass)
将始终返回1。我不认为这是正确的,但我尝试了所有方法,以使它给出正确的答案。我可能最终只会使用一个派生表,但我希望我能用这种方式来解决它。你知道一个很好的资源来解释SQL格式化背后的逻辑吗?因为我发现可读性和SQLServer和其他人所说的是两件非常不同的事情。谢谢你的回答!:)@wootscootinboogie。我的风格是在我使用SQL的这些年(几十年)中个人发展起来的。我想我在“使用SQL和Excel进行数据分析”的第1章中对此进行了描述。我发现,当我试图调整到完全不同的格式时,我往往会错过语言中的重要元素。@GordonLinoff当1=ROW_NUMBER()时的
情况下,
对于以后在下一行视图中的求和是一个很棒的大师级动作。@DougPorter。请不要帮我“忙”重新格式化我的代码。您可以在“使用SQL和Excel进行数据分析”的第1章中了解我的缩进样式。这完全是有意为之。它对2012年的答案有什么贡献?注意:
order by
count
窗口中没有任何意义。这是一个问题还是一个答案?@tibtib我建议写下你的完整回答,以便你的目标明确。我之前的评论不正确,所以我删除了它。在基本层面上,我只是注意到密集秩的最大值可以以稍微更直观的方式给出相同的结果。您只需在窗口函数中包装一个聚合最大值,即可进行正确的分区。例如:
SELECT class,name,MAX(MAX(densite_rank))OVER(PARTITION BY class,name,densite_rank()OVER(PARTITION BY class ORDER BY name))FROM(SELECT class,name,densite_rank()OVER(PARTITION BY class ORDER BY name))作为exu table GROUP BY 1,2
-1错误:假设您有三列:time,animalId,cameraId。我想为每种动物选择不同数量的相机。这将为所有结果提供1。如果我
按animalId分区,则cameraId
。否则,如果按单个列进行分区,将针对所有窗口而不是每个窗口进行分区animal@wootscootinboogie您应该能够将此项标记为已接受的正确答案。比最初标记的要容易得多。