sql - 正确分组sql

标签 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。

最佳答案

您需要按名称分区引导调用,而不是按名称排序

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;

关于sql - 正确分组sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40086469/

相关文章:

sql - 为每个用户选择最大记录

mysql - 如何选择在项目上工作时间最长的员工

php - Carbon.php 行 425 : Trailing data with SQL database 中的 Laravel InvalidArgumentException

mysql - 如果第二个表满足要求,则从多个表中选择数据

c# - 如何获得具有不同背景颜色的下拉菜单。下拉选项是动态的

mysql - SQL - 尝试关联数据

sql - 如何查询 stackoverflow 风格的评论?

sql - sql中的高级单词搜索

php - 更新 SQL 表将 varchar 转换为 int

php - 如何使用 where 和 like 语句从表中选择数据并回显它