当前位置: 首页 > 面试题库 >

SQL:在一个字段中按最小值分组,同时选择不同的行

令狐跃
2023-03-14
问题内容

这就是我想要做的。假设我有这张桌子t:

key_id | id | record_date | other_cols
1      | 18 | 2011-04-03  | x
2      | 18 | 2012-05-19  | y
3      | 18 | 2012-08-09  | z
4      | 19 | 2009-06-01  | a
5      | 19 | 2011-04-03  | b
6      | 19 | 2011-10-25  | c
7      | 19 | 2012-08-09  | d

对于每个ID,我想选择包含最小record_date的行。所以我会得到:

key_id | id | record_date | other_cols
1      | 18 | 2011-04-03  | x
4      | 19 | 2009-06-01  | a

我看到的唯一解决方案是假定所有record_date条目都是不同的,但在我的数据中并非如此。使用带有两个条件的子查询和内部联接将为我提供某些ID的重复行,这是我不想要的:

key_id | id | record_date | other_cols
1      | 18 | 2011-04-03  | x
5      | 19 | 2011-04-03  | b
4      | 19 | 2009-06-01  | a

问题答案:

怎么样:

SELECT mt.*     
FROM MyTable mt INNER JOIN
    (
        SELECT id, MIN(record_date) AS MinDate
        FROM MyTable
        GROUP BY id
    ) t ON mt.id = t.id AND mt.record_date = t.MinDate

这将获取每个ID的最短日期,然后基于这些值获取值。唯一的重复项是同一ID的最小record_dates重复。



 类似资料:
  • 问题内容: 在我有一个像这样的表的情况下: 我只想为每个工作人员(用staff_id表示)选择一个记录,列出他们的主要技能,用mainskill中的(1)表示。如果没有主要技能,我想退还该工作人员的任何技能记录。例如: 查询应返回: 我尝试了分组,DISTINCT等的各种组合,但无法获得我想要的输出。任何帮助表示赞赏。 问题答案: SQL Server 2005+,使用CTE: SQL Serve

  • 问题内容: 我想查找一位讲师在特定年份教过多少个模块,并想要选择该讲师的姓名和该讲师的模块数。 问题在于,因为我正在选择,并且必须按名称对其进行分组才能使其正常工作。但是,如果有两个讲师姓名相同,该怎么办?然后,sql将使它们合而为一,这将是错误的输出。 因此,我真正想做的是选择,但选择group by ,而sql不允许我这样做。有办法解决吗? 下表是: 到目前为止,这是我的查询: 问题答案:

  • 我有ES索引,其中包含以下格式的文档,这些文档使用Fluentd解析器从日志中解析,并在ES中索引。记录格式: {"id":"id1","field 1":"f1_val","消息":"XXXX","时间":"XXXX"} {"id":"id1","field 2":"f2_val","消息":"XXXX","时间":"XXXX"} {"id":"id1","field 3":"f3_val","

  • 问题内容: 我有一个Access 2010数据库,其中存储源计算机和目标计算机的IP地址。如果我的数据库中有以下条目 是否有任何查询来选择唯一对?也就是说,查询的输出应为 问题答案: 您的问题似乎暗示两件事: 列出源/目标对时,您只想查看一个方向上的对,例如(A,B),而不是(B,A)。 该列表应省略源和目标相同的对,例如(D,D) 在这种情况下,查询… …针对包含…的[SomeTable]运行时

  • 问题内容: 我有包含以下字段的表: 如何创建SQL,请选择按ID,DATE_FROM,DATE_TO对结果进行分组并从价格中选择最低的值。 所以结果是 问题答案:

  • 问题内容: 所以这是我的设置,我有2个具有以下(简化)模式的旧表和新表 我正在寻找一种SQL查询,该查询返回以下内容,但在1个查询中包含4列,而不是每个2列包含2个查询 因此,我理想的结果集将包含4列: 谢谢! 问题答案: 您是否尝试过JOIN语句: