按特定列分组并对SQL中的一列连续值求和

按特定列分组并对SQL中的一列连续值求和,sql,sql-server,Sql,Sql Server,通过使用此查询,我有一个数据集: SELECT ThanaId, RoadId, (ToChain-FromChain) as TotalChain, FromChain, ToChain, SurfaceType FROM Segment WHERE ThanaId = (SELECT MIN(ThanaId) AS ThanaId FROM RdLineDiagTemp) AND RoadId = (SELECT MIN(RoadId) AS RoadId FROM RdLineDia

通过使用此查询,我有一个数据集:

SELECT ThanaId, RoadId, (ToChain-FromChain) as TotalChain, FromChain, ToChain, SurfaceType
FROM Segment
WHERE ThanaId = (SELECT MIN(ThanaId) AS ThanaId FROM RdLineDiagTemp)
   AND RoadId = (SELECT MIN(RoadId) AS RoadId FROM RdLineDiagTemp)
ORDER BY FromChain
数据集是:

 ThanaId | RoadId | TotalChain | FromChain | ToChain | SurfaceType
 54701   |1368    |3100        |0          |3100     |BC
 54701   |1368    |2000        |3100       |5100     |BC
 54701   |1368    |750         |5100       |5850     |BC
 54701   |1368    |920         |5850       |6770     |BC
 54701   |1368    |73          |6770       |6843     |BC
 54701   |1368    |2000        |6843       |8843     |BC
 54701   |1368    |4007        |8843       |12850    |Ert
 54701   |1368    |2000        |12850      |14850    |BC
我想这样展示:

 ThanaId | RoadId | TotalChain | FromChain | ToChain | SurfaceType
 54701   |1368    |8843        |0          |8843     |BC
 54701   |1368    |4007        |8843       |12850    |Ert
 54701   |1368    |2000        |12850      |14850    |BC

这里,每个连续的TotalChain将针对连续的相同曲面类型求和。我应该写什么查询来实现这一点?

这是一个缺口和孤岛问题

您可以使用如下查询:

SELECT ThanaId, 
   RoadId, 
   SUM(TotalChain) AS TotalChain, 
   MIN(FromChain) AS FromChain, 
   MAX(ToChain) AS ToChain, 
   SurfaceType
FROM 
(
   SELECT ThanaId, RoadId, (ToChain-FromChain) as TotalChain, 
          FromChain, ToChain, SurfaceType,
          ROW_NUMBER() OVER (PARTITION BY ThanaId, RoadId 
                             ORDER BY FromChain) -
          ROW_NUMBER() OVER (PARTITION BY ThanaId, RoadId, SurfaceType 
                             ORDER BY FromChain) AS grp
   FROM Segment
   WHERE ThanaId = (SELECT MIN(ThanaId) AS ThanaId FROM RdLineDiagTemp)
         AND 
         RoadId = (SELECT MIN(RoadId) AS RoadId FROM RdLineDiagTemp)
) AS t
GROUP BY ThanaId, RoadId, SurfaceType, grp
ORDER BY FromChain


注意:我假设字段
FromChain
决定行顺序。

使用
行数的差异,因为
Giorgos Betsos
说这是一个间隙和孤岛问题


你好有两个BC SurfaceType,为什么?你怎么知道连续曲面类型,没有列知道顺序。我想他想要一个联接、求和或分组依据。这可能会帮助你标题上写着分组依据。。。你在正确的轨道上!
select ThanaId, RoadId, max(ToChain) - min(FromChain) TotalChain, 
                        min(FromChain) FromChain, max(ToChain) ToChain, SurfaceType 
from (
    select *,
          row_number() over (order by ThanaId, RoadId) Seq1,
          row_number() over (partition by SurfaceType order by ThanaId, RoadId) Seq2 
    from table t
) tt
group by ThanaId, RoadId, SurfaceType, (Seq1-Seq2)