正确分组 sql

Correct grouping sql

我正在尝试按 ID 和名称将一些结果分组到 table 中。对于该组,我还想 select 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;

我得到以下结果,我做了 not expect

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。

您需要 partition 您的 lead 呼叫的名称,而不是 order

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;