【问题标题】:Rank a subset of data containing duplicates对包含重复项的数据子集进行排名
【发布时间】:2022-10-13 04:29:58
【问题描述】:

我正在尝试对以下数据子集进行排名;

实现第 1 行的排名,对于前两行,使其输出类似于以下内容;

这是 SQL 小提琴示例;

http://sqlfiddle.com/#!18/f7690e/2

【问题讨论】:

  • 为什么 testemailD 的预期排名 =1/1/4/4 ?
  • 我希望能够对 expectedRank = 1 进行子集化 - 因为它们是最新的增量。
  • 你能解释一下逻辑吗? testemaild 1?等你将如何手动完成?
  • 我想在行下添加一个 where 子句,表示对 ExpectedRank > 1 的记录进行过滤。在这种情况下,我们有最新版本的 ExpectedRank = 1,这是我感兴趣的版本。

标签: sql sql-server tsql gaps-and-islands


【解决方案1】:

好像很经典差距和岛屿问题。

您想按日期对每个电子邮件岛进行排名。一个常见的(如果不是特别有效)解决方案是使用LAG 检查前一行,然后使用窗口条件COUNT 创建编号。

SELECT
  CustomerId,
  QuoteEmail,
  CreatedDateTime,
  OverallQuoteRank,
  COUNT(CASE WHEN PrevEmail = QuoteEmail THEN NULL ELSE 1 END) OVER (PARTITION BY CustomerId ORDER BY CreatedDateTime DESC)
FROM (
    SELECT *,
      PrevEmail = LAG(QuoteEmail) OVER (PARTITION BY CustomerId ORDER BY CreatedDateTime DESC)
    FROM temptable tt
) tt;

SQL Fiddle

【讨论】:

    【解决方案2】:

    您的数据似乎是成对输入的,您可以将 CreatedDateTime 列格式化为小时分钟创建一个“配对密钥”。

    我不认为这个解决方案是完美的,因为CreatedDateTime 值可以插入不匹配的小时和分钟值(即2022-10-11 12:302022-10-11 12:31)。您可以使用您的 OverallRank 列来创建更好的配对密钥,但如果我是您,我会创建一个新列以在您的 INSERT 期间使用密钥。

    建立密钥后,您可以使用DENSE_RANK 完成其余工作。

    话虽如此,此查询对于您提供的示例数据来说已经足够了:

     SELECT *, 
          DENSE_RANK() OVER(ORDER BY FORMAT(CreatedDateTime,'hh:mm') DESC, CustomerId, QuoteEmail) AS ExpectedOutcome 
          FROM temptable
        ORDER BY OverallQuoteRank DESC
    

    小提琴here

    结果:

    CustomerId QuoteEmail CreatedDateTime OverallQuoteRank ExpectedOutcome
    99888 testemailD@hotmail.co.uk 2022-10-11 12:30:15.560 10 1
    99888 testemailD@hotmail.co.uk 2022-10-11 12:30:05.297 9 1
    99888 testemailBio@gmail.com 2022-10-11 12:29:44.287 8 2
    99888 testemailBio@gmail.com 2022-10-11 12:29:43.060 7 2
    99888 testemailBio@gmail.com 2022-10-11 12:29:42.017 6 2
    99888 testemailBio@gmail.com 2022-10-11 12:29:28.853 5 2
    99888 testemailerDa@googlemail.com 2022-10-11 12:29:14.557 4 3
    99888 testemailerDa@googlemail.com 2022-10-11 12:29:05.027 3 3
    99888 testemailD@hotmail.co.uk 2022-10-11 12:28:39.673 2 4
    99888 testemailD@hotmail.co.uk 2022-10-11 12:28:24.257 1 4

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-14
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 2016-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多