【问题标题】:SQL Pattern to select only first row from a group仅从组中选择第一行的 SQL 模式
【发布时间】: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 中使用相关子查询,但再多的索引混乱也不会让它在合理的时间内运行。

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

【问题讨论】:

标签: sql sql-server


【解决方案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

【讨论】:

    猜你喜欢
    • 2011-11-12
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2014-01-17
    相关资源
    最近更新 更多