【问题标题】:How can I RANK() OVER PARTITION BY with a WHERE Clause如何使用 WHERE 子句对分区进行 RANK()
【发布时间】:2019-08-06 17:31:18
【问题描述】:

我需要在一个表中做 2 个等级,一个用于所有行,一个用于总生产量大于零的位置。有没有办法用排名函数做到这一点?

SELECT 
       LocationNumber
      ,[Date]
      ,Oil+Gas+Water as [TotalFluid]
      ,sum(Oil + Gas + Water ) over (partition by [LocationNumber] order by [Date] asc) as [CumTotalFluid]
      ,rank() over (partition by [LocationNumber] order by [Date] asc) as TABLE_DAY
      ,rank() over (partition by [LocationNumber] order by [Date] asc WHERE CumTotalFluid > 0) as Prod_DAY

FROM DV

【问题讨论】:

  • 如果我是你,我会在我的对象名称中拼出“累积”一词。 ; )

标签: sql sql-server ranking-functions


【解决方案1】:

你可以使用条件逻辑:

SELECT LocationNumber, [Date], (Oil+Gas+Water) as [TotalFluid],
       sum(Oil + Gas + Water ) over (partition by [LocationNumber] order by [Date] asc) as [CumTotalFluid],
       rank() over (partition by [LocationNumber] order by [Date] asc) as TABLE_DAY
       (CASE WHEN CumTotalFluid > 0
             THEN rank() over (partition by [LocationNumber], CASE WHEN CumTotalFluid > 0 THEN 1 ELSE 0 END order by [Date] asc
                              ) 
        END) as Prod_DAY
FROM DV;

外部case 只返回条件为真的值。 partition by中的case将数据分成了两个(更多)集合,所以排名是正确的。

【讨论】:

  • 感谢您的想法 - 我尝试了您的建议,但使用表达式计算 [CumTotalFluid] 时出现错误,即窗口函数不能在另一个窗口函数或聚合的上下文中使用。关于如何解决这个问题的任何建议?
  • @Ryan。 . .如果是计算字段,则需要使用子查询或 CTE。
猜你喜欢
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
  • 2011-09-22
  • 2019-03-26
相关资源
最近更新 更多