SQL Server 2008:查找具有相等值的连续行数

时间:2016-07-29 00:01:46

标签: sql .net sql-server gaps-and-islands

我有一张包含多个ID的表格。每个Id都有按顺序索引排列的值。

create table myValues
(
  id  int,
  ind int,
  val int
)

insert into myValues
values
(21, 5, 300),
(21, 4, 310),
(21, 3, 300),
(21, 2, 300),
(21, 1, 345),
(21, 0, 300),
(22, 5, 300),
(22, 4, 300),
(22, 3, 300),
(22, 2, 300),
(22, 1, 395),
(22, 0, 300)

我试图找到相同的连续值的数量。

值字段表示应在每个条目上更改的一些数据(但不一定总体上是唯一的)。

问题是找出具有相同值的两个以上连续行的时间(给定相同的id)。

因此我正在寻找这样的输出:

id  ind   val   count
21  5     300   1
21  4     310   1
21  3     300   2
21  2     300   2
21  1     345   1
21  0     300   1
22  5     300   4
22  4     300   4
22  3     300   4
22  2     300   4
22  1     395   1
22  0     300   1

我知道这与所讨论的岛屿和间隙问题类似here

然而,这些解决方案都取决于能否使用具有应该连续增加的值的分区语句。

生成“岛屿”范围作为中介的解决方案也可以,例如

id  startind   endind
21  3          2
22  5          2

请注意,每个ID可以有许多岛屿。

我确信岛屿解决方案有一个简单的改编,但对于我的生活,我无法想到它。

2 个答案:

答案 0 :(得分:2)

找到连续组,然后按

执行count()分区
select  id, ind, val, count(*) over (partition by id, val, grp)
from
(
    select  *, grp = dense_rank() over (partition by id, val order by ind) - ind
    from    myValues
) d
order by id, ind desc

答案 1 :(得分:0)

另一种解决方案显然更优雅。我必须自己研究一下。

<% @organisation_requests.each do |org_req| %>
  ...
<% end %>