【问题标题】:Dense rank is not generating rows correctly密集排名未正确生成行
【发布时间】:2020-08-05 12:39:36
【问题描述】:

我有一张桌子 A:

Create table A(
    Name varchar(10),
    Number integer,
    Exc integer,
    D1 date
)

我已插入 11 行。

Sel * from A;
+ -----+--------+-----+------------+ |姓名 |号码 | EXC | D1 | + -----+--------+-----+------------+ |一个 | 1 | 1 | 2020-02-03 | |一个 | 1 | 2 | 2020-02-03 | |一个 | 1 | 3 | 2020-02-03 | |一个 | 1 | 4 | 2020-02-03 | |一个 | 1 | 1 | 2020-02-04 | |一个 | 1 | 2 | 2020-02-04 | |一个 | 1 | 3 | 2020-02-04 | |一个 | 1 | 1 | 2020-02-05 | |一个 | 1 | 2 | 2020-02-05 | |一个 | 1 | 3 | 2020-02-05 | |一个 | 1 | 4 | 2020-02-05 | + -----+--------+-----+------------+

现在,当我应用如下密集排名时:

sel vt.*,dense_rank() OVER(PARTITION BY Name,Number,EXC ORDER BY D1 ) AS rn
from vt;

输出:

+ -----+--------+-----+------------+----+ |姓名 |号码 | EXC | D1 |注册护士 | + -----+--------+-----+------------+----+ |一个 | 1 | 1 | 2020-02-03 | 1 | |一个 | 1 | 2 | 2020-02-03 | 1 | |一个 | 1 | 3 | 2020-02-03 | 1 | |一个 | 1 | 4 | 2020-02-03 | 1 | |一个 | 1 | 1 | 2020-02-04 | 2 | |一个 | 1 | 2 | 2020-02-04 | 2 | |一个 | 1 | 3 | 2020-02-04 | 2 | |一个 | 1 | 1 | 2020-02-05 | 3 | |一个 | 1 | 2 | 2020-02-05 | 3 | |一个 | 1 | 3 | 2020-02-05 | 3 | |一个 | 1 | 4 | 2020-02-05 | 2 | + -----+--------+-----+------------+----+

预期:

+ -----+--------+-----+------------+----+ |姓名 |号码 | EXC | D1 |注册护士 | + -----+--------+-----+------------+----+ |一个 | 1 | 1 | 2020-02-03 | 1 | |一个 | 1 | 2 | 2020-02-03 | 1 | |一个 | 1 | 3 | 2020-02-03 | 1 | |一个 | 1 | 4 | 2020-02-03 | 1 | |一个 | 1 | 1 | 2020-02-04 | 2 | |一个 | 1 | 2 | 2020-02-04 | 2 | |一个 | 1 | 3 | 2020-02-04 | 2 | |一个 | 1 | 1 | 2020-02-05 | 3 | |一个 | 1 | 2 | 2020-02-05 | 3 | |一个 | 1 | 3 | 2020-02-05 | 3 | |一个 | 1 | 4 | 2020-02-05 | 3 |

【问题讨论】:

  • 您使用的是哪个 dbms?
  • 这是NAME=a, NUMBER=1, EXC=4第二个最低日期,那么为什么您期望是 3 而不是 2?

标签: sql date select window-functions


【解决方案1】:

PARTITION 中删除列EXC 会得到您期望的结果:

DENSE_RANK() OVER(PARTITION BY Name, Number ORDER BY D1)

Demo on DB Fiddle

姓名 |号码 |除外 | d1 | rn :--- | -----: | --: | :--------- | :- 一个 | 1 | 1 | 2020-02-03 | 1 一个 | 1 | 2 | 2020-02-03 | 1 一个 | 1 | 3 | 2020-02-03 | 1 一个 | 1 | 4 | 2020-02-03 | 1 一个 | 1 | 1 | 2020-02-04 | 2 一个 | 1 | 2 | 2020-02-04 | 2 一个 | 1 | 3 | 2020-02-04 | 2 一个 | 1 | 1 | 2020-02-05 | 3 一个 | 1 | 2 | 2020-02-05 | 3 一个 | 1 | 3 | 2020-02-05 | 3 一个 | 1 | 4 | 2020-02-05 | 3

【讨论】:

  • 好的,知道了。但是你能解释一下为什么即使日期保持不变,排名又重新变成了 2 吗?
  • @Princy:具有相同名称、编号和日期的行获得相同的排名。当日期改变时它会增加,当名称/号码不同时它会重置。
【解决方案2】:

您只是想按日期对所有行进行排名吗?然后去掉partition子句,这样就不会在groups里面进行排名了。

select name, number, exc, d1, dense_rank() over (order by d1) as rn
from vt
order by d1, name, number, exc;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多