Tsql Select语句-选择第一组结果,其中所有条目均不为空
我正在尝试编写一个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
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,那么它将返回多年