按特定列分组并对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)