SQL 服务器:超过分区

SQL Server : Over Partition

我正在尝试使用函数 Partition 来生成结果,不幸的是我正在处理其他 table 没有主键的设计,我无法添加一个 "terrible I know"

我的示例代码如下

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 来获得以下结果,但在这种情况下,我会更好地使用分区,因为这只是我尝试做的一个例子,所以还有更多配合这个。

我想要做的是 return 每次 TaskNo 更改时 Hours 列的第一个值,因此结果应该是

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

如果有人能提供帮助,我们将不胜感激。

谢谢菲尔

您必须按 TaskNo OrderNo 进行分区才能获得您想要的结果。由于您没有任何有意义的方法来对这些分区中的行进行排序,因此您只能按 TaskNo 排序,但不能保证您每次都会获得相同的 "first" 记录订单指标:

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

您将使用 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 个表代表 无序 个集合。集合中没有第一行或最后一行。您需要一个指定排序的列。无论该列是什么,都将其用于 ??.