我有一个SQL Server表,其中包含不同股票代码的多年每日数据时间序列。一些符号比其他符号具有更多的数据,因为它们的时间序列与其他符号相比在不同的日期开始或结束。
我想从SQL Server数据库和表中的第一个日期条目中获取所有符号的一行。我尝试了这个SQL语句
<parameter name="useCloudEnv" value="true"/>
<parameter name="cloudEnvName" value="browserstack"/>
<!--<parameter name="cloudEnvName" value="saucelabs"/>-->
<parameter name="os" value="Windows"/>
<parameter name="os_version" value="10"/>
<parameter name="browserName" value="chrome"/>
<parameter name="browserVersion" value="60.0"/>
<parameter name="url" value="https://www.uhc.com//"/>
<test name = "Test">
<classes>
<class name="testhomepage.TestHomePage"/>
</classes>
</test>
,但是这会返回所有符号的最小日期相同的唯一行,例如全部的最小日期为2008-1-1。如果开始日期不是2008-1-1,则其余符号似乎已被过滤掉。
什么是正确的SQL?
答案 0 :(得分:2)
您的where子句错误。您需要...
WHERE results_eod.symbol = s2.symbol
如果列symbol
中有多个表,则当前作用域中的表优先。本质上,通过不在WHERE子句中指定表,您可以...
WHERE s2.symbol = s2.symbol
完全有资格获得您的推荐信总是值得的。不要懒惰,不要错过表名/别名。
答案 1 :(得分:1)
也尝试一下。输出应包含所有符号,每个符号的日期最少,每个符号在不同的行上。
select symbol,min(date)
from results_eod
group by symbol
order by date
答案 2 :(得分:0)
在查询中引用了多个表时,所有所有列均应限定(即具有表别名)。该建议对于相关子查询特别重要。
所以:
SELECT r.date, r.symbol
FROM results_eod r
WHERE r.date = (SELECT MIN(r2.date)
FROM results_eod r2
WHERE r2.symbol = r.symbol
)
ORDER BY r.symbol;
否则,子查询中的引用(例如symbol
)可能是错误的表。
使用results_eod(symbol, date)
上的索引,这可能是编写查询的最有效方式。但是,人们通常这样写:
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;