【问题标题】:Hive sql rank over idHive sql 排名超过 id
【发布时间】:2017-12-17 22:09:16
【问题描述】:

我有这个数据。我想聚合它并在聚合数据上放置一个 row_number。

| ID_1  | time| ID_2 |
a,        1,    36
a,        2,    36
a,        3,    45
a,        4,    65
b,        1,    75
b,        2,    35
b,        3,    35
b,        4,    76

所需的输出看起来像这样。

| ID_1  | ID_2 | Row_number |
a,        36,    1
a,        45,    2
a,        65,    3
b,        75,    1
b,        35,    2
b,        76,    3

我的尝试是使用以下代码:

select
ID_1, ID_2,
row_number() over (partition by ID_1, ID_2 order by time desc) as Row_number
from table1

但这会产生:

| ID_1  | ID_2|  Row_number |
a,        36,    1
a,        36,    2
a,        45,    1
a,        65,    1
b,        75,    1
b,        35,    1
b,        35,    2
b,        76,    1

如果我最后使用 group by,我会得到一些时间错误,因为我没有在 group by。

【问题讨论】:

  • 我在预期输出中看不到任何聚合。您是否只想删除每个 id1、id2 组合的重复项?
  • 好吧,我不想删除重复项,因为时间变量不会是重复项。但我确实想要 ID_1 和 ID_2 的所有唯一组合,然后按时间对它们进行排名。

标签: sql hive rank


【解决方案1】:

您需要先按ID_1,ID_2 分组,然后在其上应用row_number()。

SELECT id_1,
       id_2,
       row_number()
         OVER (
           partition BY id_1
           ORDER BY time ) AS Row_number
FROM   (SELECT id_1,
               id_2,
               MAX(time) time
        FROM   table1
        GROUP  BY id_1,
                  id_2) b;  

DEMO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多