繁体   English   中英

GROUP BY特定列并在SQL中求和一列连续值

[英]GROUP BY Specific Column and sum one columns consecutive values in SQL

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

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所说,使用row_numbers差异是一个空白和孤岛的问题。

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM