문제

아래와 같이 테이블이 있습니다

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'

이 두 결과를 결합하기 위해 나는 Union을 사용합니다.

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'

다른 팁

노동 조합의 일부인 선정 된 진술에서 명령은 무시됩니다. 따라서 상단 1은 임의의 레코드를 선택하고 있습니다 (테이블의 클러스터 키에 의한 첫 번째 레코드).

노조와 함께 사용하면 주문의 주문이 유효하지 않습니다 ...

나는 당신이 찾고 있던 결과를 얻기 위해 어떤 순위와 사례 진술 속임수를 사용하여 일반적인 테이블 표현식을 사용하여 빠른 더러운 일을했습니다.

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는 쿼리에서 반환 된 속도, 날짜, 현재 및 정렬 플래그를 정의합니다 ...

이 사례는 검색 날짜 이전의 결과와 검색 날짜 이후의 결과를 분리합니다. 우리는 Union의 사례 (CUR)의 결과를 사용하여 분할 된 목록에서 결과를 가져옵니다 ..

그런 다음 랭크 () 함수는 사례 명령문이 목록을 분리하는 데 사용하는 것과 동일한 기준에 파티션을 만들어 목록을 정렬합니다. 그런 다음 유효 날짜로 내림차순으로 주문합니다. 이것은 "과거"목록을 가져 와서 가장 최신 "과거"항목 순위 1 ..

그런 다음 쿼리의 노조 부분에서 ..

맨 위에서, 우리는 "과거"목록 (cur = 0)과 "과거"목록의 첫 번째 항목에서 순위와 날짜를 얻고 있습니다. 0 검색 날짜 이전에 기록이없는 경우 ..

그런 다음 우리는 "현재"목록 (cur = 1)의 모든 레코드와 결합합니다.

그리고 마지막으로 .. 우리는 노조의 결과를 취하고 .. 그리고 발효 날짜까지 우리에게 모든 현재 기록과 "가장 현재의"기록을 제공하도록 명령합니다.

위의 쿼리는 <= 및> = 대신 <and>를 사용하여 05/01/2009를 제외하고 있다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top