我有一个表,如下

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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top