SQL - 分组依据,保留最早的行

标签 sql group-by

我有下表:

name         team         date
-----------------------------------
John         A-team       02-5-2014
Jessica      A-team       08-6-2015
David        A-team       11-2-2013
Bill         B-team       12-5-2017
Nicole       B-team       18-1-2010
Brandom      B-team       22-9-2012

我正在尝试创建一个查询,它可以:

  • 每队一行,所以我们分组
  • 选择最先发生的行,因此我们在 min(date) 上聚合

以下查询给出团队和日期:

select   team, min(date)
from     my_table
group by team

但是我怎样才能检索到该名称呢?我尝试了以下查询,但现在我得到了所有行(我理解,因为分组没有执行任何操作,因为现在所有行都是唯一的):

select   name, team, min(date)
from     my_table
group by team, name

最佳答案

进行自联接,使用第一个查询作为子查询来查找每个团队的第一个日期:

select t1.*
from my_table t1
join
  (select team, min(date) min_date
   from my_table
   group by team) t2 on t1.team = t2.team and t1.date = t2.min_date

如果团队第一次约会时有两个名字,则返回两个名字。

如果您只想每个团队一行,即使该日期有两个名称,您也可以执行另一个GROUP BY,或者简单地NOT EXISTS:

select t1.*
from my_table t1
where not exists (select 1 from my_table t2
                  where t2.team = t1.team
                    and (t2.date < t1.date
                         or (t2.date = t1.date and t2.name < t1.name))

关于SQL - 分组依据,保留最早的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42438192/

相关文章:

Mysql 查询连接条件不起作用

mysql - SQL Group 通过返回错误结果

sql - 存储过程;插入缓慢

SQL Counting 计数结果

mysql - GROUP BY 导致 ORDER BY 不起作用

mysql - 如何对字符串的最大值进行分组,同时保留字符串而不是其字符数?

mysql - 按 ID 对结果进行分组并在 MySql 上将多条记录显示在一行中

c# - LINQ 查询字符串[] 按多个匿名列分组

c# - C# 中的 SQL 批量复制/插入

sql - Always Encrypted 列的 EF Core 小数精度