就个人而言,我不喜欢像你展示的那样返回压缩在一起的数据(161-161)。它是前端呈现数据以供显示的功能。下面的查询在单独的列中返回原始范围,但如果您确实需要,将它们组合起来很容易。
这里的解决方案适用于 SQL Server 2005 及更高版本,它可以真正开始被认为是“现代”的。它使用的技术是通过区分行位置与 id 进行分组。顺序范围与 ID 等距,因此可以很好地组合在一起。
要在 SQL Server 6.5 (!!) 中获得相同的结果,您必须通过#temp 表进行管道传输,利用INSERT..SELECT..ORDER BY 语句中的 ORDERING GUARANTEE生成行编号为迈克尔已经展示了(只需将引用更改@T
为#T
)。
-- sample table for discussion
create table tbl (
pallet_id varchar(10),
serial bigint);
insert tbl values
('PA193876',157029161),
('PA193876',157029163),
('PA193876',157029164),
('PA193876',157029165),
('PA193876',157029166),
('PA193876',157029177),
('PA193876',157029178),
('PA193876',157029179);
-- the query
select pallet_id, min(serial) serial_from, max(serial) serial_to
from
(
select pallet_id, serial, grp = serial - row_number() over (order by serial)
from tbl
) X
group by pallet_id, grp
order by pallet_id, serial_from;
-- the results
PALLET_ID SERIAL_FROM SERIAL_TO
PA193876 157029161 157029161
PA193876 157029163 157029166
PA193876 157029177 157029179
例如right(min(serial),10) + ' - ' + right(max(serial),10) serial_range