SQL - 从表中连续出现的值中显示名称 ID

Posted

技术标签:

【中文标题】SQL - 从表中连续出现的值中显示名称 ID【英文标题】:SQL - Display Name ID from Consecutive Occurrences of values in a Table 【发布时间】:2020-10-28 11:56:52 【问题描述】:

我创建了一个表,例如“Table1”,见下文;

Name    Year        
John    2003
Lyla    1994
Faith   1996
John    2002
Carol   2000
Carol   1999
John    2001
Carol   2002
Lyla    1996
Lyla    1997
Carol   2001
John    2009

根据上表,我总结了我的发现。

Carol连续4年参加; 1999、2000、2001、2002 约翰连续三年参加; 2001, 2002, 2003 – John 也参加了 2009 年,但这不计入连胜纪录。 Lyla 参加了 1994、1996、1997 年,但这不是连续三年。 Faith 只参加了 1 次。

我要做的是编写一个 SQL 查询,其中仅显示表中的名称 ID,其中用户连续 3 年或更长时间参与,所以我应该只得到“卡罗尔”和'约翰' 基于上述内容。

我不太确定如何写这个,希望有人可以指导我。

我只是想出了一个简短的基本开始,如下所示,但老实说,我不确定这是否是正确的方法。

Select Name From Table1
Where Year = ?
Order by Name asc
Group by Year

【问题讨论】:

如果您已经创建了表作为示例,那么还请包括 DDL 和 INSERT 语句.. 【参考方案1】:

假设您每人每年有一行,您可以使用lag()select distinct

select distinct name
from (select t.*,
             lag(year, 2) over (partition by name order by name) as prev2_year
      from table1 t
     ) t
where prev2_year = year - 2;

这只是为每个名称回顾两行并将该行的年份与当前行的年份进行比较。如果连续三年,那么那一年就是year - 2

您也可以使用joins 来执行此操作,但上面的可能效果更好:

select distinct t1.name
from table1 t1 join
     table1 t1_1
     on t1.name = t1_1.name and
        t1.year = t1_1.year + 1 join
     table1 t1_2
     on t1.name = t1_2.name and
        t1.year = t1_2.year + 2;

【讨论】:

谢谢你,戈登,我会试一试的。【参考方案2】:
select 
   n1.name,
   SUM(CASE WHEN n2.year is null then 0 else 1 end)+1 YearsInRow
from Table1 n1
left join Table1 n2 on n2.name=n1.name and (n2.year=n1.year+1 ) 
GROUP by n1.name
HAVING SUM(CASE WHEN n2.year is null then 0 else 1 end)+1 >=3

输出:

name       YearsInRow
---------- -----------
Carol      4
John       3

【讨论】:

我也会尝试上述方法,因为它看起来正是我需要的。谢谢。 @Luuk 。 . .如果这些年之间存在差距,请检查它会做什么。我不认为它符合 OP 的意图。 @GordonLinoff:如果我将最后一个3 更改为2(查找连续两年的人)名为“Lyla”的人也会被找到,所以我看不到问题你认为存在。 @Luuk 。 . .此数据没有连续 3 年:dbfiddle.uk/…。 好的,我向您添加了一个(更改的)查询fiddle,结论,您的解决方案更快更易读...?

以上是关于SQL - 从表中连续出现的值中显示名称 ID的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 使用 in 子句从表中选择字符串

SQL语句

SQL:在表中查找缺失的 ID

通过SQL根据匹配模式从表中检索名称?

mysql从表中显示数据最大值和总和

从表中的多个值中选择不在数组中的位置