【问题标题】:Correct grouping sql正确分组sql
【发布时间】:2016-10-17 12:31:41
【问题描述】:

我正在尝试按其 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。

【问题讨论】:

    标签: sql sql-server select lead


    【解决方案1】:

    您需要按名称分区您的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;
    

    【讨论】:

    • 啊,原来如此
    • 如果我在前导函数中进行排序,我不希望在主函数的最后一条语句中使用相同的排序吗?
    • @angryip:您可以使用PARTITION BY name ORDER BY name ASC, id ASC,但由于每个分区只有一个名称,因此是多余的。
    • @angryip 是的,Thorsten 说的。
    • 我明白了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多