【问题标题】:pull first matching row from sql group从 sql 组中提取第一个匹配行
【发布时间】:2012-02-09 22:04:21
【问题描述】:

假设您有如下投影:

Artist         Painting            Year
---------------------------------------
Alfred         Birds               1945
Alfred         Apples&Oranges      1947
Ben            ZealousNeighbours   1912
Calum          Hope Spliced        1760
Calum          Horseplay           1765
Calum          Earth               1780
David          Apples&Oranges      1947

如何返回以下第一个关系:

Artist         Painting            Year
---------------------------------------
Alfred         Birds               1945
Ben            ZealousNeighbours   1912
Calum          Hope Spliced        1760
David          Apples&Oranges      1947

即每个画家画的第一幅画..

仅限 ANSI SQL

【问题讨论】:

  • 同一年有两幅画应该怎么办?
  • 这两个,按字母顺序返回第一个,虽然没有规定

标签: sql group-by ansi-sql


【解决方案1】:

尝试以下方法:

SELECT
    [Artist],
    [Painting],
    [Year]
FROM
(
    SELECT
        [Artist],
        [Painting],
        [Year],
        ROW_NUMBER() OVER(PARTITION BY [Artist] ORDER BY [Year] ASC) AS [Rank]
    FROM
        [Table]
) AS a
WHERE
    a.[Rank] = 1

【讨论】:

  • @egrunin 提出了一个有效的问题。您可以在上面的Rank 确定中添加二级订单。示例:ORDER BY [Year] ASC, [Painting] ASC
  • 我会逐字发布的内容。 +1
【解决方案2】:

这应该适用于任何符合 ANSI-89 的 SQL 方言,但是如果艺术家在第一年做了多幅画,它就会中断 - 如果您需要更精细的粒度,您可以通过存储实际的日期时间值而不是仅存储年份来调整它.

SELECT * 
FROM Paintings 
    INNER JOIN
    (SELECT Artist, MIN([Year]) MinYear 
     FROM Paintings 
     GROUP BY Artist) 
    Minimum ON Minimum.MinYear = Paintings.Year AND Minimum.Artist = Paintings.Artist

如果您的 SQL 符合 ANSI-2003,您可以执行上面列出的 diaho。

e:我认为没有办法保证仅使用 ANSI-89 SQL 为每位艺术家返回一行。

【讨论】:

  • 问题是我为形成这种关系而创建的查询。我需要回到绘图板上,不过感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 2017-11-30
  • 2021-03-06
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多