正确分组 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;
我正在尝试按 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;