【问题标题】:SQL Query getting the latest record of the Group and calculate the value of those particular recordsSQL 查询获取组的最新记录并计算这些特定记录的值
【发布时间】:2021-04-02 03:41:43
【问题描述】:

我确实有下表(只是一个示例),并且想要从 Record2 减去 Record1 的点数。 (Record2-Record1) 来自记录 1 和记录 2 的最新记录。记录输入匹配类别。 1 场比赛将包含 2 条记录,即记录 1 和记录 2。 输出将是 3,因为最新记录是来自 Match2 的 ID 3 和 4。)

ID Name Points TimeRecorded Match
1 Record 1 3 2-Mar 2pm 1
2 Record 2 5 2-Mar 2pm 1
3 Record 1 5 4-Mar 5pm 2
4 Record 2 8 4-Mar 5pm 2

我试图得到减去两个查询的值,如下所示。但我觉得这不是好方法,因为它是硬编码的比赛和记录的名称。我可以知道如何构造一个更好的查询以获取分组匹配的最新记录并计算从 Record2 中减去 Record1 的点数。

SELECT
    (select Points from RunRecord where Name= 'Record2' AND Match = 2)
  - (select Points  from RunRecord where  Name= 'Record1' AND Match = 2)

【问题讨论】:

  • TimeRecorded 列的类型是什么?是文字吗?
  • @TimBiegeleisen 它在时间戳(DateTime)中

标签: sql sql-server


【解决方案1】:

你可以使用:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY TimeRecorded DESC) rn
    FROM yourTable
)

SELECT
    MAX(CASE WHEN Name = 'Record 2' THEN Points END) -
    MAX(CASE WHEN Name = 'Record 1' THEN Points END) AS diff
FROM cte
WHERE rn = 1;

CTE 为每组同名记录分配一个行号,其中 1 分配给最近的记录。然后,我们对整个表格进行聚合,并从这些点中找出差异。

【讨论】:

    【解决方案2】:

    您可以使用rank() 窗口函数将记录按match 降序排列。然后取排名靠前的记录,使用条件聚合控制points添加的符号。

    SELECT sum(CASE x.name
                 WHEN 'Record2' THEN
                   x.points
                 WHEN 'Record1' THEN
                   -x.points
               END)
           FROM (SELECT rr.name,
                        rr.points,
                        rank() OVER (ORDER BY rr.match DESC) r
                        FROM runrecord rr
                        WHERE name IN ('Record1',
                                       'Record2')) x
           WHERE x.r = 1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 2021-01-10
      • 2010-09-19
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 2020-07-21
      相关资源
      最近更新 更多