【问题标题】:Adding Conditional Clause(Where) to Dense Rank Function向密集秩函数添加条件子句(Where)
【发布时间】:2019-10-31 12:03:01
【问题描述】:

我想创建一个排名函数来计算一个人访问属性BY DATE 的次数,但条件不包括访问类别。 'Calls'

DENSE_RANK() over(partition by activitytable.[Property] 
ORDER BY activitytable.[Date] as Job rank

这样做会对我不想要的整个通讯表进行排序。

表格

---- ActivityID ----------Property --------DATE ------CommunicationType --------------- -排名

1046        Red Property      30/10/2019           Field                  2                      
10467       Red Property      29/10/2019           Field                  1
10591       Red Property      28/10/2019          Calls                   
10971       Blue Property     27/10/2019           Field                  2
10971       Blue Property     26/10/2019           Field                  1
10971       Blue Property     26/10/2019           calls                     
10965       Green Property    24/10/2019           calls
10765       Green Property    23/10/2019           calls
10765       Green Property    19/10/2019           field                  3
10765       Green Property    15/10/2019           field                  2
10765       Green Property    12/10/2019           field                  1

理想情况下,我希望表格如上所示,以忽略通信类型列的调用元素并仅计算字段类别。我怎么能这样做?

【问题讨论】:

  • 请显示您想要的结果。

标签: sql sql-server dense-rank ranking-functions


【解决方案1】:

你需要通过PropertyCommunicationType进行分区:

表:

CREATE TABLE #Data (
    ActivityID int,
    Property varchar(100),
    [DATE] date,
    CommunicationType varchar(10)
)
INSERT INTO #Data
    (ActivityID, Property, [DATE], CommunicationType)
VALUES
    (1046,  'Red Property',    '20191030', 'field'),
    (10467, 'Red Property',    '20191029', 'field'),
    (10591, 'Red Property',    '20191028', 'calls'),
    (10971, 'Blue Property',   '20191027', 'field'),
    (10971, 'Blue Property',   '20191026', 'field'),
    (10971, 'Blue Property',   '20191026', 'calls'),
    (10965, 'Green Property',  '20191024', 'calls'),
    (10765, 'Green Property',  '20191023', 'calls'),
    (10765, 'Green Property',  '20191019', 'field'),
    (10765, 'Green Property',  '20191015', 'field'),
    (10765, 'Green Property',  '20191012', 'field')

声明:

SELECT 
    *,
    CASE 
        WHEN CommunicationType = 'field' THEN DENSE_RANK() OVER (PARTITION BY Property, CommunicationType ORDER BY [DATE] ASC)
        ELSE NULL
    END AS Rank
FROM #Data

结果:

ActivityID  Property    DATE        CommunicationType   Rank
10971   Blue Property   2019-10-26  calls               NULL
10971   Blue Property   2019-10-26  field               1
10971   Blue Property   2019-10-27  field               2
10765   Green Property  2019-10-23  calls               NULL
10965   Green Property  2019-10-24  calls               NULL
10765   Green Property  2019-10-12  field               1
10765   Green Property  2019-10-15  field               2
10765   Green Property  2019-10-19  field               3
10591   Red Property    2019-10-28  calls               NULL
10467   Red Property    2019-10-29  field               1
1046    Red Property    2019-10-30  field               2

【讨论】:

  • @shevchenko2020 希望对您有所帮助。如果您认为这个或任何其他答案是您问题的最佳解决方案,您可以接受(只能接受一个答案)。谢谢。
【解决方案2】:

试试吧:

CASE WHEN CommunicationType <> 'CAlls' THEN DENSE_RANK() over(partition by activitytable.[Property] ORDER BY activitytable.[Date] ELSE NULL END AS Job rank

【讨论】:

  • 我认为您还需要按CommunicationType 进行分区。
  • @Alex 基本上,我只是复制OP子句-这里的关键是使用CASE WHENIIF将某些行排除在排名之外-排名子句可能是他喜欢的.
  • 我相信您不会以这种方式将行排除在排名之外,您只会将值隐藏在 Select 中,即该值计入排名,只是不显示。与CASE ... SUM 相同,与SUM( CASE ... 不同。
  • 感谢您的回答,几乎可以工作,但这并没有完全忽略空值,只是像跳过它一样。 1,2,3 空,5 等
【解决方案3】:

您没有重复的日期,所以只需使用累积总和:

sum(case when communicationtype <> 'Calls'
         then 1 else 0
    end) over (partition by activitytable.[Property] order by activitytable.[Date]
              ) as Job_rank

如果您希望按人获得此排名,大概还有一个代表“人”的列。

如果您确实需要dense_rank(),因为存在重复项,那么答案更具挑战性。以下应该做你想做的事:

select (case when communicationtype = 'Visits'
             then dense_rank() over (partition by activitytable.[Property], communicationtype
                                     order by activitytable.[Date]
                                    )
        end) as job_rank

注意:该值不会出现在带有Calls 的行上。是否有必要尚不清楚。

【讨论】:

  • 谢谢,这看起来可行。这里的关键是使用 case when 语句将通信类型添加到分区中。干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
  • 2016-12-16
  • 1970-01-01
  • 2013-12-23
  • 2021-04-09
  • 1970-01-01
  • 2022-12-19
相关资源
最近更新 更多