仅从组中选择第一行的 SQL 模式
Posted
技术标签:
【中文标题】仅从组中选择第一行的 SQL 模式【英文标题】:SQL Pattern to select only first row from a group 【发布时间】:2016-08-11 12:37:06 【问题描述】:我有一个包含大量条目的表,我只需要每个组中的第一个。
该表用于存储过去 30 年的每日基金价格(1000 多只基金)。我需要找到该日期存在的每个基金在该日期之前或特定日期的最后价格(因此每个基金只有一行)。
在其简化形式中,该表包含 Date、FundCode 和 Price 列。
以下输入
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 模式的主要内容,如果未能解决你的问题,请参考以下文章