0

例如,我有列表pallet_id 和serial

我想从

pallet_id       serial 
PA1             161
PA1             163
PA1             164
PA1             165
PA1             166
PA1             177
PA1             178
PA1             179

pallet_id       serial 
PA1             161-161
PA1             163-166
PA1             177-179

连续剧增加 1 需要坚持作为一个范围组

目前我只使用视图。如果有另一种方法可以做到这一点而不会导致存储过程,请告知。

我现在正在开发 SP,因为我找不到其他方法。

使用 MSSQL2000 或更低版本.. 6.5?正如这里所说.. 所以这个 SQL 版本中没有函数。升级也不是一种选择。

4

2 回答 2

4
create table #T
(
  ID int identity,
  pallet_id varchar(8),
  serial int
)

insert into #T(pallet_id, serial)
select pallet_id, serial
from YourTable
order by pallet_id, serial

select pallet_id, min(serial) min_serial, max(serial) max_serial
from #T
group by pallet_id, serial - ID

drop table #T

SQL小提琴

于 2012-10-09T06:24:35.757 回答
-2

就个人而言,我不喜欢像你展示的那样返回压缩在一起的数据(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

于 2012-10-09T06:20:23.380 回答