sql 具有最大和最小函数的排序算法
sql sorting algorithm with max and min func
我有一个 table 有 1,2,3,4,5 个数字。我如何使用 T-SQL:
进行排序
5,1,2,3,4
- 第一行:max(Id)
- 第二行:min(Id)
- 其他行:无所谓
但计数行必须为 5
你可以这样做。
SELECT top 5 t1.num
FROM SomeTable as t1, SomeTable as t2
GROUP BY t1.num
ORDER BY CASE
WHEN t1.Num = MAX(t2.Num) THEN 1
WHEN t2.Num = MAX(t2.Num) THEN 2
ELSE 3
END
一个简单的方法是使用 ORDER BY
和 CASE
:
SELECT id
FROM #t as t
ORDER BY CASE
WHEN id = (SELECT MAX(id) FROM #t) THEN 1
WHEN id = (SELECT MIN(id) FROM #t) THEN 2
ELSE 3
END
还有一个选择。这能够将 Min 和 Max 组合成一个查询。不确定性能优势有多大,但如果它很大 table 它可能会有所帮助。最简单的解决方案是 Giorgios 发布的解决方案。这个人在他出色的性能解决方案上会有轻微优势。
with Something(SomeID, SomeValue) as
(
select 1, 'Minimum' union all
select 2, 'asdf' union all
select 3, 'qwer' union all
select 4, 'ljkh' union all
select 5, 'Maximum'
)
, MinMaxVal as
(
select MAX(SomeID) as MaxSomeID
, MIN(SomeID) as MinSomeID
from Something
)
select s.*
from Something s
left join MinMaxVal mmv on mmv.MaxSomeID = s.SomeID or mmv.MinSomeID = s.SomeID
order by MaxSomeID desc
, MinSomeID desc
, s.SomeID desc
The Idea is to get the maximum and the remaining items in ascending order
Select Tmax.*, -1 as zOrder From TbT as Tmax Where Tmax.ID = (Select Max(id) from tbt)
Union
Select Tmin.*, ID as zOrder From TbT as Tmin Where Tmin.ID <> (Select Max(id) from tbt)
Order by zOrder;
我只是相信它可以 运行 在大数据量上更快,因为最大值只计算两次。
我有一个 table 有 1,2,3,4,5 个数字。我如何使用 T-SQL:
进行排序 5,1,2,3,4
- 第一行:max(Id)
- 第二行:min(Id)
- 其他行:无所谓
但计数行必须为 5
你可以这样做。
SELECT top 5 t1.num
FROM SomeTable as t1, SomeTable as t2
GROUP BY t1.num
ORDER BY CASE
WHEN t1.Num = MAX(t2.Num) THEN 1
WHEN t2.Num = MAX(t2.Num) THEN 2
ELSE 3
END
一个简单的方法是使用 ORDER BY
和 CASE
:
SELECT id
FROM #t as t
ORDER BY CASE
WHEN id = (SELECT MAX(id) FROM #t) THEN 1
WHEN id = (SELECT MIN(id) FROM #t) THEN 2
ELSE 3
END
还有一个选择。这能够将 Min 和 Max 组合成一个查询。不确定性能优势有多大,但如果它很大 table 它可能会有所帮助。最简单的解决方案是 Giorgios 发布的解决方案。这个人在他出色的性能解决方案上会有轻微优势。
with Something(SomeID, SomeValue) as
(
select 1, 'Minimum' union all
select 2, 'asdf' union all
select 3, 'qwer' union all
select 4, 'ljkh' union all
select 5, 'Maximum'
)
, MinMaxVal as
(
select MAX(SomeID) as MaxSomeID
, MIN(SomeID) as MinSomeID
from Something
)
select s.*
from Something s
left join MinMaxVal mmv on mmv.MaxSomeID = s.SomeID or mmv.MinSomeID = s.SomeID
order by MaxSomeID desc
, MinSomeID desc
, s.SomeID desc
The Idea is to get the maximum and the remaining items in ascending order
Select Tmax.*, -1 as zOrder From TbT as Tmax Where Tmax.ID = (Select Max(id) from tbt)
Union
Select Tmin.*, ID as zOrder From TbT as Tmin Where Tmin.ID <> (Select Max(id) from tbt)
Order by zOrder;
我只是相信它可以 运行 在大数据量上更快,因为最大值只计算两次。