【问题标题】:SQL Select Case When Count > 1计数 > 1 时 SQL 选择大小写
【发布时间】:2020-10-06 15:00:27
【问题描述】:

我有一张如下所示的表格。

ParentID | PersonID | Year 
----------------------------  
1             1       2019
1             2       2020
3             3       2019
3             4       2020
5             5       2019

我试图弄清楚当 ParentID 有多个记录时如何选择当前的 PersonID,所以我的结果如下所示。

ParentID | PersonID | Year 
----------------------------  
1             2       2020
3             4       2020
5             5       2019

我不能只选择最大 PersonID,因为我们有时会创建上一年的 Person 记录,在这种情况下,PersonID 更大,我们仍然希望返回今年的记录。我也不能根据年份进行选择,因为如果他们没有今年的记录,我们仍然需要他们每年的最新记录。

此时我已尝试以六种方式选择此子集,但只能设法让我的大脑受伤。任何帮助将不胜感激!

【问题讨论】:

标签: sql date select case greatest-n-per-group


【解决方案1】:

这是一个典型的每组最大 n 问题。要解决它,您需要考虑过滤而不是聚合

一种可移植的解决方案是使用相关子查询进行过滤,该子查询根据parent_id 返回最新的year

select t.*
from mytable t
where t.year = (
    select max(t1.year) from mytable t1 where t1.parent_id = t.parent_id
)

【讨论】:

    【解决方案2】:

    假设您使用的是 MSSQL,这可以通过ROW_NUMBER 来实现。你可以阅读更多关于ROW_NUMBERhere的信息。 PARTITION BY 将结果划分为分区并将行号应用于分区。因此,对ParentId 应用分区并按Year 降序排序,数据按Year 排序ParentId。然后使用RowNo = 1 条件删除旧数据。

    Create Table Test(ParentId int, PersonId int, Year int);
    INSERT INTO Test values 
    (1, 1, 2019), 
    (1, 2, 2020),
    (3, 3, 2019),
    (3, 4, 2020), 
    (5, 5, 2019);
    
    SELECT ParentId, PersonId, Year FROM
    (
      SELECT ROW_NUMBER() OVER(PARTITION BY ParentId 
      ORDER BY Year /* Use PersonId if it fits correctly */ DESC) AS RowNo,
      ParentId, PersonId, Year from Test -- Table Name
     ) E WHERE ROWNo = 1
    

    【讨论】:

      猜你喜欢
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多