在每个查询中使用 UNION 的 ORDER BY
ORDER BY with UNION in each query
我有一个关于 UNION ALL
的查询
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
中给我错误。
我该如何解决?
编辑
抱歉,忘了说我想 SELECT 一天的第一个和最后一个数据
您只能在最后一个查询的 UNION
上使用 ORDER BY
。要实现您想要的输出:
SELECT the First and the Last data from one day
您可以使用 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
但是如果首尾数据相同,结果会不同。第一个查询将 return 2 个相同的行,而第二个查询将只 return 1 行。
我有一个关于 UNION ALL
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
中给我错误。
我该如何解决?
编辑 抱歉,忘了说我想 SELECT 一天的第一个和最后一个数据
您只能在最后一个查询的 UNION
上使用 ORDER BY
。要实现您想要的输出:
SELECT the First and the Last data from one day
您可以使用 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
但是如果首尾数据相同,结果会不同。第一个查询将 return 2 个相同的行,而第二个查询将只 return 1 行。