2015-12-04 5 views
0

У меня есть запрос с UNION ALLORDER BY с UNION в каждом запросе

SELECT TOP 1 * FROM Test WHERE Username LIKE '%me%' 
AND DateTime > '2015-12-03' AND DateTime < '2015-12-04' ORDER BY DateTime ACS 
UNION ALL 
SELECT TOP 1 * FROM Test WHERE Username LIKE '%me%' 
AND DateTime > '2015-12-03' AND DateTime < '2015-12-04' ORDER BY DateTime DESC 

Но этот запрос дает мне ошибку в UNION.

Как это можно решить?

EDIT К сожалению, забыл сказать, что я хочу, чтобы выбрать первые и последние данные от одного дня

+0

* WHY ALL CAPS? * – Raptor

+0

не беспокойтесь о шапках, его просто привычка –

ответ

1

Вы можете использовать только ORDER BY на UNION на последний запрос. Для достижения желаемого выхода:

выберите первый и последние данные от одного дня

Вы можете использовать ROW_NUMBER:

;WITH Cte AS(
    SELECT *, 
     rn1 = ROW_NUMBER() OVER(ORDER BY DateTime ASC), 
     rn2 = ROW_NUMBER() OVER(ORDER BY DateTime DESC) 
    FROM Test 
    WHERE 
     Username LIKE '%me%' 
     AND DateTime > '2015-12-03' 
     AND DateTime < '2015-12-04' 
) 
SELECT * FROM Cte WHERE rn1 = 1 UNION ALL 
SELECT * FROM Cte WHERE rn2 = 1 

Вы можете также упростить это с помощью OR вместо UNION ALL

;WITH Cte AS(
    SELECT *, 
     rn1 = ROW_NUMBER() OVER(ORDER BY DateTime ASC), 
     rn2 = ROW_NUMBER() OVER(ORDER BY DateTime DESC) 
    FROM Test 
    WHERE 
     Username LIKE '%me%' 
     AND DateTime > '2015-12-03' 
     AND DateTime < '2015-12-04' 
) 
SELECT * FROM Cte WHERE rn1 = 1 OR rn2 = 1 

Но результат будет другим, если первый и последний данные будут одинаковыми. Первый запрос возвращает 2 одинаковых строки, а второй возвращает только 1 строку.

+0

спасибо, это то, что я ищу –

+0

Я предпочитаю первый запрос, потому что мне нужны эти 2 строки –