SQL : Order와 함께 Union Query에서 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'
이 두 결과를 결합하기 위해 나는 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를 제외하고 있다고 생각합니다.