Tsql Select语句-选择第一组结果,其中所有条目均不为空

Tsql Select语句-选择第一组结果,其中所有条目均不为空,tsql,sql-server-2012,Tsql,Sql Server 2012,我正在尝试编写一个select语句,该语句将允许我选择“每一年”值包含一个条目的最近一年 以以下为例: EarningsYearID EarningsID Year Value 1 1 2015 NULL 2 1 2014 1.27 3 1 2013 3.21 4 2 2015

我正在尝试编写一个select语句,该语句将允许我选择“每一年”值包含一个条目的最近一年

以以下为例:

EarningsYearID EarningsID   Year   Value 
1                 1         2015    NULL
2                 1         2014    1.27
3                 1         2013    3.21
4                 2         2015    7.21
5                 2         2014    6.97
6                 2         2013    2.22
正确答案应为“2014年”,因为2014年是该年所有条目包含非空值的最近一年

我尝试了以下查询:

DECLARE @YearInWhichEarningsExistForAllComparisonCompanies as int; SET @YearInWhichEarningsExistForAllComparisonCompanies = (SELECT TOP 1 ey.[Year] FROM company c, earnings e, earningsYear ey WHERE c.ticker_id = e.ticker_id AND e.EarningsID = ey.EarningsID AND c.tickerSymbol IN ('AA', 'BB') AND ey.Value is not null ORDER by ey.[Year] DESC); 但是,返回的“2015”不正确,因为存在一个为空的“2015”条目,我要求所有条目都不为空。因此,下一个可用的2014年应该是正确的答案

希望这是有意义的。

如果值为正值

select max([Year]) 
from 
(
SELECT [Year]
FROM company c, earnings e, earningsYear ey
WHERE c.ticker_id = e.ticker_id
AND e.EarningsID = ey.EarningsID
AND c.tickerSymbol IN ('AA', 'BB') 
group by [Year]
having min(isnull(ey.Value, -1000)) > -1000 
) tt
如果值为正

select max([Year]) 
from 
(
SELECT [Year]
FROM company c, earnings e, earningsYear ey
WHERE c.ticker_id = e.ticker_id
AND e.EarningsID = ey.EarningsID
AND c.tickerSymbol IN ('AA', 'BB') 
group by [Year]
having min(isnull(ey.Value, -1000)) > -1000 
) tt

您的查询缺少order by列,您可以尝试以下代码:

SET @YearInWhichEarningsExistForAllComparisonCompanies = (SELECT TOP 1 ey.[Year]
    FROM company c, earnings e, earningsYear ey
    WHERE c.ticker_id = e.ticker_id
    AND e.EarningsID = ey.EarningsID
    AND c.tickerSymbol IN ('AA', 'BB')
    AND ey.Value is not null ORDER by ey.EarningsID, ey.[Year] DESC);
关于可读性,您也可以参考以下内容:

SELECT TOP 1
    @YearInWhichEarningsExistForAllComparisonCompanies = ey.[Year]
FROM
    company c
    JOIN earnings e ON c.ticker_id = e.ticker_id
    JOIN earningsYear ey ON e.EarningsID = ey.EarningsID
WHERE
    c.tickerSymbol IN ('AA', 'BB')
    AND ey.Value is not null
ORDER by
    ey.EarningsID, 
    ey.[Year] DESC
请参阅下面的更新脚本:

; WITH YEARVALUE ([Year], Value)
AS
(
    SELECT
        ey.[Year], ey.Value
    FROM
        company c
        JOIN earnings e ON c.ticker_id = e.ticker_id
        JOIN earningsYear ey ON e.EarningsID = ey.EarningsID
    WHERE
        c.tickerSymbol IN ('AA', 'BB')
)

SELECT
    @YearInWhichEarningsExistForAllComparisonCompanies = MAX(Year)
FROM
    YEARVALUE
WHERE
    [Year] NOT IN (
        SELECT
            Year
        FROM
            YEARVALUE
        WHERE
            Value IS NULL)

SELECT @YearInWhichEarningsExistForAllComparisonCompanies --show latest year with no null value

您的查询缺少order by列,您可以尝试以下代码:

SET @YearInWhichEarningsExistForAllComparisonCompanies = (SELECT TOP 1 ey.[Year]
    FROM company c, earnings e, earningsYear ey
    WHERE c.ticker_id = e.ticker_id
    AND e.EarningsID = ey.EarningsID
    AND c.tickerSymbol IN ('AA', 'BB')
    AND ey.Value is not null ORDER by ey.EarningsID, ey.[Year] DESC);
关于可读性,您也可以参考以下内容:

SELECT TOP 1
    @YearInWhichEarningsExistForAllComparisonCompanies = ey.[Year]
FROM
    company c
    JOIN earnings e ON c.ticker_id = e.ticker_id
    JOIN earningsYear ey ON e.EarningsID = ey.EarningsID
WHERE
    c.tickerSymbol IN ('AA', 'BB')
    AND ey.Value is not null
ORDER by
    ey.EarningsID, 
    ey.[Year] DESC
请参阅下面的更新脚本:

; WITH YEARVALUE ([Year], Value)
AS
(
    SELECT
        ey.[Year], ey.Value
    FROM
        company c
        JOIN earnings e ON c.ticker_id = e.ticker_id
        JOIN earningsYear ey ON e.EarningsID = ey.EarningsID
    WHERE
        c.tickerSymbol IN ('AA', 'BB')
)

SELECT
    @YearInWhichEarningsExistForAllComparisonCompanies = MAX(Year)
FROM
    YEARVALUE
WHERE
    [Year] NOT IN (
        SELECT
            Year
        FROM
            YEARVALUE
        WHERE
            Value IS NULL)

SELECT @YearInWhichEarningsExistForAllComparisonCompanies --show latest year with no null value

对不起,实际上“值”在某些情况下可能是负数。有一个最小值它永远不会低于你可以使用的值吗?不幸的是没有,我的意思是我可以使用一些荒谬的数字,但这将是一种我不喜欢的黑客。黑客?荒谬的对于数据类型,将有最小值。如果我使用一个较大的负值,即>-1000,那么它将返回多年。实际上,“值”在某些情况下可能为负值。有一个最小值它将永远不会低于您可以使用的值吗?不幸的是,没有,我的意思是我可以用一些荒谬的数字,但这将是一种我不喜欢的黑客。黑客?荒谬的对于数据类型,将有最小值。如果我使用一个较大的负值,即>-1000,那么它将返回多年