更正日期最低的唯一行的SQL语句

更正日期最低的唯一行的SQL语句,sql,sql-server-2012,Sql,Sql Server 2012,我有一个SQL Server表,其中包含不同股票符号的年日数据时间序列。一些符号比其他符号具有更多的数据,因为它们的时间序列的开始或结束日期与其他符号不同 我想从SQLServer数据库中获取一行所有符号以及表中的第一个日期条目。我尝试了这个SQL语句 sql = "SELECT date, symbol FROM results_eod WHERE date = (SELECT MIN(date) FROM results_eod s2

我有一个SQL Server表,其中包含不同股票符号的年日数据时间序列。一些符号比其他符号具有更多的数据,因为它们的时间序列的开始或结束日期与其他符号不同

我想从SQLServer数据库中获取一行所有符号以及表中的第一个日期条目。我尝试了这个SQL语句

sql = "SELECT date, symbol  
       FROM results_eod  
       WHERE date = (SELECT MIN(date) FROM results_eod s2 
                     WHERE symbol = s2.symbol)  
       ORDER BY symbol"
但这将返回一行唯一的所有符号,其中它们的最小日期相同,例如,all具有相同的2008-1-1的最小日期。如果开始日期不是2008-1-1,其余的符号似乎被过滤掉了


什么是正确的SQL?

您的where子句错误。你需要

WHERE results_eod.symbol = s2.symbol
如果有多个表具有列
符号
,则当前范围内的表具有优先权。本质上,通过在WHERE子句中不指定表,您已经

WHERE s2.symbol = s2.symbol

完全限定你的推荐人总是值得的。不要偷懒,不要错过表名/别名。

您的where子句是错误的。你需要

WHERE results_eod.symbol = s2.symbol
如果有多个表具有列
符号
,则当前范围内的表具有优先权。本质上,通过在WHERE子句中不指定表,您已经

WHERE s2.symbol = s2.symbol

完全限定你的推荐人总是值得的。不要偷懒,不要错过表名/别名。

当查询中引用了多个表时,所有列都应该是限定的(即具有表别名)。此建议对于相关子查询尤其重要

因此:

否则,子查询中的引用(如
symbol
)可能指向错误的表

结果\u eod(符号,日期)
上有一个索引,这可能是编写查询最有效的方法。然而,人们通常这样写:

select r.*
from (select r.*,
             row_number() over (partition by r.symbol order by r.date) as seqnum
      from results_eod r
     ) r
where seqnum = 1;

当查询中引用了多个表时,所有列都应该是限定的(即具有表别名)。此建议对于相关子查询尤其重要

因此:

否则,子查询中的引用(如
symbol
)可能指向错误的表

结果\u eod(符号,日期)
上有一个索引,这可能是编写查询最有效的方法。然而,人们通常这样写:

select r.*
from (select r.*,
             row_number() over (partition by r.symbol order by r.date) as seqnum
      from results_eod r
     ) r
where seqnum = 1;

试试这个。输出应包含每个符号日期最低的所有符号,每个符号位于不同的行上

select symbol,min(date)
from results_eod
group by symbol
order by date

试试这个。输出应包含每个符号日期最低的所有符号,每个符号位于不同的行上

select symbol,min(date)
from results_eod
group by symbol
order by date

只是一行,还是每个符号一行?任何符号都可以有多个具有相同日期戳的行吗?每个符号一行,表中对应的最低日期。不,日期是唯一的。只有一行,还是每个符号一行?任何符号都可以有多个具有相同日期戳的行吗?每个符号一行,表中对应的最低日期。不,日期是唯一的。