SQL:在UNION查询使用前1排序
-
20-08-2019 - |
题
我有一个表,如下
Rate Effective_Date
---- --------------
5.6 02/02/2009
5.8 05/01/2009
5.4 06/01/2009
5.8 12/01/2009
6.0 03/15/2009
我应该找到有效的当前日期和之后的所有利率。因此,要获得目前的效率,我使用
SELECT TOP 1 * from table
where effective_date < '05/05/2009'
order by effective date desc
有率当前日期之后的查询是
SELECT * from table
where effective_date > '05/05/2009'
要结合这两种结果,我使用的联合作为
SELECT TOP 1 * from table
where effective_date < '05/05/2009'
order by effective date desc
UNION
SELECT * from table
where effective_date > '05/05/2009'
预期的结果是
Rate Effective Date
---- --------------
5.8 05/01/2009
5.4 06/01/2009
5.8 12/01/2009
6.0 03/15/2009
但我得到的实际结果为
Rate Effective Date
---- --------------
5.6 02/02/2009
5.4 06/01/2009
5.8 12/01/2009
6.0 03/15/2009
我没有线索,为什么出现这种情况?任何建议?
解决方案
它的工作原理是这样的:
select *
from (
select top 1 *
from table
where effective_date <= '05/05/2009'
order by effective_date desc
) as current_rate
union all
select *
from table
where effective_date > '05/05/2009'
其他提示
在ORDER BY在SELECT语句是联盟的一部分被忽略。因此你的TOP 1是选择一些arbitary记录(可能是由该表的聚集键的第一个记录)。
用一台Union使用时
顺序按无效...
我的工作了使用公共表表达式与一些排名和Case语句弄虚作假匆匆和肮脏的啄得到你要找的..结果
WITH CTE_RATES ( RATE, EFFECTIVE_DATE, CUR, SORT )
AS (
SELECT
Rate,
Effective_date,
CASE WHEN Effective_date > '5/5/2009' THEN 1
ELSE 0
END,
RANK() OVER (PARTITION BY
CASE WHEN EFFECTIVE_DATE > '5/5/2009' THEN 1
ELSE 0
END
ORDER BY EFFECTIVE_DATE DESC)
FROM TestTable
)
SELECT RATE, EFFECTIVE_DATE
FROM (
SELECT RATE, EFFECTIVE_DATE
FROM CTE_RATES
WHERE CUR = 0 AND SORT = 1
UNION ALL
SELECT RATE, EFFECTIVE_DATE
FROM CTE_RATES
WHERE CUR = 1
) AS QRY
ORDER BY EFFECTIVE_DATE
要解释发生了什么......
在CTE定义的速率,日期,当前和排序从查询返回的标志...
时的结果为那些之前检索日期是,和那些检索日期之后。我们使用的结果从的情况下(CUR)在我们工会从分区列表拉动的结果分离。
秩()函数然后通过创建关于该CASE语句使用分开列表中的相同的标准分区对列表进行排序..然后我们为了通过以递减的方式的有效日期。这将需要“过去”的名单,并是最新的“过去”入门级1 ..
然后,在查询的接头部..
在顶部,我们正在从“过去”列表中的排名和日期(CUR = 0),并在“过去”列表中的第一项。(排序= 1)..这将返回1记录(或0,如果没有记录之前的检索日期是)..
然后,我们的联盟,这与所有的记录的从“当前”列表(CUR = 1)
于是最后..我们采取UNION ..和秩序由生效日期给我们目前所有的记录,以及“最新”以前的记录结果。
相信上述查询通过使用<和>而不是<=和> =不含05/01/2009。
不隶属于 StackOverflow