ROW_NUMBER()OVER函数未运行所有记录

时间:2018-02-14 15:37:39

标签: sql amazon-redshift window-functions

我有一张这样的表

shortest = s1.GetShortestWord();
Console.WriteLine(shortest.Data);

我运行以下查询来获取行号:

ID  Date    Sale    Sale_desc
1   1/1/2017    10  book
1   1/1/2017    10  book
1   1/1/2017    10  book
2   1/2/2017    12  notebook
2   1/2/2017    12  notebook
3   1/3/2017    1   pen
3   1/3/2017    1   pen

但结果并非我的预期。

select *, row_number() over (partition by id order by date) 
from the_table;

前3行的row_num应该是1,2,3,但看起来row_num()没有遍历所有行。请帮忙。谢谢

2 个答案:

答案 0 :(得分:0)

我猜你的id列是字符串(VARCHAR/CHAR)。你可以尝试:

select *, row_number() over (partition by CAST(id AS INTEGER) order by date) 
from the_table;

<强> Rextester demo

答案 1 :(得分:0)

当我运行相同的代码时,我会得到您期望的结果。我对可能与您使用的列类型不同的列类型做了一些假设。我正在使用默认排序规则进行测试,这会影响字符串比较。

如果您运行相同的测试用例并获得正确的结果,则问题出在代码中的其他位置。我们需要查看更多原始查询和架构才能找到问题。

declare @Test table
(
    ID int,
    [Date] Date,
    Sale int,
    Sale_desc varchar(50)
)

insert into @Test
(ID, [Date], Sale, Sale_desc)
select 1, '1/1/2017', 10, 'book'     union all
select 1, '1/1/2017', 10, 'book'     union all
select 1, '1/1/2017', 10, 'book'     union all
select 2, '1/2/2017', 12, 'notebook' union all
select 2, '1/2/2017', 12, 'notebook' union all
select 3, '1/3/2017', 1 , 'pen'      union all
select 3, '1/3/2017', 1 , 'pen'

select
    *,
    row_number() over (partition by id order by [date]) as row_num
from @test

结果:

ID  Date        Sale  Sale_desc   row_num
1   2017-01-01  10    book        1
1   2017-01-01  10    book        2
1   2017-01-01  10    book        3
2   2017-01-02  12    notebook    1
2   2017-01-02  12    notebook    2
3   2017-01-03  1     pen         1
3   2017-01-03  1     pen         2