【问题标题】:(Serial Column) Filtering SQL Query and shortening the results to Range(Serial Column) 过滤 SQL 查询并将结果缩短到 Range
【发布时间】:2012-10-09 06:08:38
【问题描述】:

例如,我有列表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 版本中没有函数。升级也不是一种选择。

【问题讨论】:

  • 从您的示例来看,您想使用什么逻辑来生成范围并不太清楚。
  • 对不起。这是范围。序列化增加 1。我正在开发我的 SP 来获取和保存以前的序列。如果它增加 1。它会保存该序列并跳过其余部分。然后跳过语句的其余部分
  • so no functions in this SQL Version - 为什么? SQL Server 2000 确实支持函数
  • 它的 sql 兼容性。 6.5 我认为它低于 sql server 2000。客户端不想升级,所以我坚持使用传统方法。我正在编辑使用视图的报告。如果我像现在这样使用存储过程。我会花更多的时间来编写软件本身。

标签: sql sql-server tsql sql-server-2000


【解决方案1】:
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 Fiddle

【讨论】:

  • @Sid - 这是多个语句,但它不一定是 SP。
  • 好的。显然我不是 SQL 的大师。你能为我指出正确的方向吗。我将如何在现有视图中实现这一点?
  • @Sid 您无法在视图中执行此操作。如果您想要 SQL Server 端的代码,您必须使用 SP,但您也可以提供来自客户端的代码。
  • 谢谢。 SP它是。无论如何,约伯都要修改他的报告。只是我加班的运气不好。谢谢。
【解决方案2】:

就我个人而言,我不喜欢像您展示的那样返回压缩在一起的数据 (161-161)。它是前端呈现数据以供显示的功能。下面的查询在单独的列中返回原始范围,但如果您确实需要,也可以很容易地组合它们。

这里的解决方案适用于 SQL Server 2005 及更高版本,它可以真正开始被认为是“现代”的。它使用的技术是通过区分行位置与 id 进行分组。顺序范围与 ID 等距,因此可以很好地组合在一起。

要在 SQL Server 6.5 (!!) 中获得相同的结果,您必须通过 #temp 表通过管道传输,利用 INSERT..SELECT..ORDER BY 语句中的 ORDERING GUARANTEE 来生成行编号为Michael has shown(只需将对@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

【讨论】:

  • ROW_NUMBER() 和 OVER() 不在 SQL 2000 中
猜你喜欢
  • 2012-01-08
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
  • 2012-04-20
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多