【问题标题】:SQL - group by, keep earliest rowSQL - 分组,保留最早的行
【发布时间】:2017-02-24 12:04:09
【问题描述】:

我有下表:

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

【问题讨论】:

  • 提示:使用join 到最短日期。

标签: sql group-by


【解决方案1】:

进行自加入,将您的第一个查询用作子查询来查找每个团队的第一个日期:

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))

【讨论】:

  • 我没想过加入同一张桌子!谢谢你。如果有多行具有相同的&lt;team, date&gt;(但不同的name),如何避免出现多个条目?
  • 做另一个分组,使用例如分钟()。
  • @JadeDezo - 那么在这种情况下你需要哪个名字?
  • 当然! @OtoShavadze我是从理论上的角度问的。我现在明白了。谢谢
  • @jarlh 感谢您的更新。 NOT EXISTS 的有趣方法。
【解决方案2】:
SELECT min(NAME)
    ,team
    ,min(DATE)
FROM my_table
GROUP BY team

【讨论】:

  • 我认为问题是从与显示日期相同的行中询问名称。但这并不完全清楚。
  • @TobySpeight 如果你是对的,那么是的,这不是正确的例子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
相关资源
最近更新 更多