代码之家  ›  专栏  ›  技术社区  ›  PJD

SQL Server:过分区

  •  -1
  • PJD  · 技术社区  · 10 年前

    我正在尝试使用函数 Partition 为了生成结果,不幸的是,我正在处理没有主键的其他表设计,我无法添加一个“我知道的很糟糕”

    我的示例代码如下

    CREATE TABLE mytable  (OrderNo varchar(20), TaskNo int, Hours Decimal(2))
    
    insert into mytable values ('GNR68003327','0001',1)
    insert into mytable values ('GNR68003327','0002',2)
    insert into mytable values ('GNR68003327','0002',2)
    insert into mytable values ('GNR68003327','0002',2)
    insert into mytable values ('GNR68003327','0003',0)
    insert into mytable values ('GNR68003327','0004',0)
    insert into mytable values ('GNR68003327','0005',0)
    insert into mytable values ('GNR68003327','0006',0)
    insert into mytable values ('GNR68003327','0007',4)
    insert into mytable values ('GNR68003327','0007',4)
    insert into mytable values ('GNR68003327','0007',4)
    insert into mytable values ('GNR68003327','0007',4)
    

    我知道我可以使用一个distinct来得到下面的结果,但在这种情况下,我会更好地使用Partition,因为这只是我试图做的一个例子,所以还有更多的东西要做。

    我想做的是返回 Hours 每列 TaskNo 所以结果应该是

    OrderNo     TaskNo  Hours 
    GRN68003327 0001    1
    GRN68003327 0002    2
    GRN68003327 0003    0
    GRN68003327 0004    0
    GRN68003327 0005    0
    GRN68003327 0006    0
    GRN68003327 0007    4
    

    我想应该是这样的,但我就是得不到要求的结果

    SELECT 
        OrderNo, TaskNo, 
        First_Value(Hours) OVER (PARTITION BY OrderNo ORDER BY TaskNo) 
    FROM 
        mytable
    

    如果有人能帮忙,我们将不胜感激。

    谢谢Phil

    2 回复  |  直到 10 年前
        1
  •  1
  •   Gordon Linoff    10 年前

    你会用 row_number() :

    select t.*
    from (select t.*,
                 row_number() over (partition by orderno, taskno order by ??) as seqnum
          from mytable t
         ) t
    where seqnum = 1;
    

    请注意 ?? 在查询中。SQL表表示 无序的 设置。集合中没有第一行或最后一行。您需要一列指定顺序。无论该列是什么,请将其用于 ?? .

        2
  •  1
  •   D Stanley    10 年前

    你必须按 TaskNo OrderNo 以获得您想要的结果。由于您没有任何有意义的方法对这些分区中的行进行排序,因此您可以通过 任务编号 ,但不能保证每次都会得到相同的“第一个”记录,而没有某种顺序指标:

    SELECT OrderNo, 
           TaskNo, 
           First_Value(Hours) OVER (PARTITION BY OrderNo , TaskNo ORDER BY TaskNo) 
    FROM mytable