仅从组中选择第一行的 SQL 模式

Posted

技术标签:

【中文标题】仅从组中选择第一行的 SQL 模式【英文标题】:SQL Pattern to select only first row from a group 【发布时间】:2016-08-11 12:37:06 【问题描述】:

我有一个包含大量条目的表,我只需要每个组中的第一个。

该表用于存储过去 30 年的每日基金价格(1000 多只基金)。我需要找到该日期存在的每个基金在该日期之前或特定日期的最后价格(因此每个基金只有一行)。

在其简化形式中,该表包含 DateFundCodePrice 列。

以下输入

Date FundCode Price 2016/01/05 X123 1.234 2016/01/04 X123 1.233 2016/01/03 X123 1.222 2016/01/05 A456 1.876 2016/01/04 A456 1.822 2016/01/03 A456 1.776 2016/01/03 M234 3.234

...当查询 2016/01/04 时,应该产生

Date FundCode Price 2016/01/04 X123 1.233 2016/01/04 A456 1.822 2016/01/03 M234 3.234

我有一个解决方案,它在 where 中使用相关子查询,但再多的索引混乱也不会让它在合理的时间内运行。

我确信有一个简单的解决方案,但我只是看不到它。

【问题讨论】:

添加一些示例表数据,以及预期的结果。同时标记使用的 dbms。 不要犹豫,提供示例数据、所需结果和您正在使用的查询。另外,请记住用您正在使用的数据库标记问题。 Tips for asking a good Structured Query Language (SQL) question 【参考方案1】:

有点像

SELECT fundCode, price, date FROM your_table WHERE date<='date_you_need' GROUP BY fundCode HAVING MAX(date)

这样的查询在 SQLITE 中有效,你使用什么数据库?

【讨论】:

抱歉,刚刚为 SQL Server 标记了问题,这似乎不适用于 SQL Server。【参考方案2】:

单个嵌套查询为我提供每个基金的最大日期,然后在fundCode/Date 上对此进行内部连接,因此...

SELECT 
  Date,
  FundCode,
  Price
FROM
  PriceHistory H
    INNER JOIN 

      /* this nested query gives the max date for each fund*/
      (SELECT 
         FundCode,
         max(Date) AS MaxDate
       FROM
         PriceHistory H2
       WHERE
         Date<=@DateToSearchFor
       GROUP BY
         FundCode) AS RowSelector

    ON H.FundCode=RowSelector.FundCode AND H.Date=RowSelector.MaxDate

【讨论】:

以上是关于仅从组中选择第一行的 SQL 模式的主要内容,如果未能解决你的问题,请参考以下文章

如何仅从组中查询具有最新时间戳的文档?

使用 activerecord 发出请求以仅从组中获取用户,而不从其他人中获取

Oracle SQL:从组中选择最大值和最小值

聚合 SQL 函数以仅从每个组中获取第一个

SQL Server 查询需要从组中提取数据

Oracle SQL:如何从组中查找记录