更正SQL语句以获取日期最少的唯一行

时间:2019-01-21 01:47:48

标签: sql sql-server-2012

我有一个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?

3 个答案:

答案 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;