正确分组sql

时间:2016-10-17 12:31:41

标签: sql sql-server select lead

我试图通过他们的id和名称将一些结果分组到一个表中。对于组,我还想选择next_id,即作为组的一部分的下一条记录的前导值。当我发出这样的查询时:

SELECT id, grade, name,
    LEAD(id) OVER (ORDER BY name ASC, id ASC) as next_id
    FROM dbo.GRADES
    where name like '%alan%'
    order by name ASC, id asc;

我得到了这个结果,这是我期待

28273   100 alan-jones  28274
28274   100 alan-jones  28275
28275   100 alan-jones  28276
28276   200 alan-jones  28280
28280   100 alan-jones  28281
28281   100 alan-jones  28282
28282   100 alan-jones  NULL

NULL指定上面的结果没有指向的下一条记录。

但是,当我在比alan更多的人身上运行此查询时,即没有where子句:

SELECT id, grade, name,
    LEAD(id) OVER (ORDER BY name ASC, id ASC) as next_id
    FROM dbo.GRADES
    order by name ASC, id asc;

我得到以下结果,我做了 期待

28277   100 mike-cools  28278
28278   100 mike-cools  28283
28283   200 mike-cools  28284
28284   200 mike-cools  28279
28279   200 mike-cools  28273
28273   100 alan-jones  28274
28274   100 alan-jones  28275
28275   100 alan-jones  28276
28276   200 alan-jones  28280
28280   100 alan-jones  28281
28281   100 alan-jones  28282
28282   100 alan-jones  NULL

特别是对我造成问题的行是:

28279   200 mike-cools  28273
28273   100 alan-jones  28274

这一行应为:

28279   200 mike-cools  NULL
28273   100 alan-jones  28274

我无法弄清楚如何将我的查询更改为正确分组,如果组不相同则不能指向next_id。

1 个答案:

答案 0 :(得分:4)

您需要通过名称分区 lead来电,而不是订单

SELECT   id, grade, name,
         LEAD(id) OVER (PARTITION BY name ORDER BY id ASC) as next_id
         -- Here -------^
FROM     dbo.GRADES
ORDER BY name ASC, id asc;