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
。
您也可以使用join
s 来执行此操作,但上面的可能效果更好:
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的主要内容,如果未能解决你的问题,请参考以下文章