如何在SQL中对此进行分组

时间:2016-02-23 09:25:09

标签: sql sql-server sql-server-2008 sql-server-2008-r2

我有这个选择

Trip Sequence Shipment Place
=================================
102  10       4798     Amsterdam
102  20       4823     Utrecht
102  30       4831     Utrecht
102  40       4830     Rotterdam
102  50       4790     Rotterdam
102  60       4840     Utrecht
102  70       4810     Amsterdam

我希望这样分组:

 Trip  Group Place
 ==========================
  102  1     Amsterdam
  102  2     Utrecht
  102  3     Rotterdam
  102  4     Utrecht
  102  5     Amsterdam

如何在SQL Server中实现此目的? @Giorgos Betos的答案很棒。后续问题:如何将这些groupnumbers分配给原始表的行?

1 个答案:

答案 0 :(得分:3)

试试这个:

SELECT Trip, Place, 
       ROW_NUMBER() OVER (ORDER BY MinSequence) AS [Group]
FROM (
  SELECT Trip, Place, MIN(Sequence) AS MinSequence
  FROM (
    SELECT Trip, Place, Sequence,
           ROW_NUMBER() OVER (ORDER BY Sequence) - 
           ROW_NUMBER() OVER (PARTITION BY Trip, Place 
                              ORDER BY Sequence) AS grp
    FROM mytable) AS x
  GROUP BY Trip, Place, grp) AS t

Demo here

修改

要获取原始未分组表格中的排名数字,您可以使用DENSE_RANK

SELECT Trip, Place, Sequence,
       DENSE_RANK() OVER (ORDER BY grp) AS [Group]
FROM (       
  SELECT Trip, Place, Sequence,
         MIN(Sequence) OVER (PARTITION BY Trip, Place, grp) AS grp
  FROM (                          
    SELECT Trip, Place, Sequence,
           ROW_NUMBER() OVER (ORDER BY Sequence) - 
           ROW_NUMBER() OVER (PARTITION BY Trip, Place 
                              ORDER BY Sequence) AS grp
    FROM mytable) AS t) AS x
ORDER BY Sequence 

Demo here