hive 如何确定在现值之前分配的价值?

zte4gxcn  于 8个月前  发布在  Hive
关注(0)|答案(2)|浏览(77)

在customer表中存在多个客户的历史记录行,并且已分配了一个ID,该ID可能已随时间发生更改
| 名称|ID|日期|
| --|--|--|
| Abhishek| 1 |2023年8月23日|
| Abhishek| 1 |2023年3月8日|
| Abhishek| 2 |2019 -06- 27 2019 -06- 27 2019 -06 - 27|
| Abhishek| 3 |2019 - 09-10 00:00:00|
| Seema|一|2023 -08- 21|
| Seema| B| 2019 -06- 22|
| Seema| C| 2020 -05- 22|
数据中的最新ID
| 名称|ID|日期|- -|
| --|--|--|--|
| Abhishek| 1 |2023年8月23日||
| Seema|一|2023 -08- 21||
所需的输出(在这些最新的ID值之前分配的ID值)是
| 名称|ID|日期|- -|
| --|--|--|--|
| Abhishek| 2 |2019 -06- 27 2019 -06- 27 2019 -06 - 27||
| Seema| B| 2019 -06- 22||
我尝试了滞后函数,但在响应中,ID中有多个更改,所需的输出不是第二个最新的ID,而是涉及不同的ID
例如:

select * from (
select Name,`id,lag(id,1) over (partition by Name order by date) as
lag_id from customer_history)

| 名称|ID|滞后ID|
| --|--|--|
| Abhishek| 1 | 2 |
| Abhishek| 2 | 3 |
| Seema|一|B|

3pvhb19x

3pvhb19x1#

如果这是MySQL,那么日期的格式应该是YYYY-mm-dd。
以下查询使用GROUP BY删除重复的ID和ROW_NUMBER():

WITH t1 AS (
    SELECT Name, ID, MAX(Date), ROW_NUMBER() OVER (PARTITION BY Name ORDER BY MAX(Date) DESC) AS rn
    FROM customer_history
    GROUP BY Name, ID
)
SELECT * FROM t1 WHERE rn = 2;

输出量:
| 名称|ID| MAX(日期)|RN|
| --|--|--|--|
| Abhishek| 2 |2023-06-17| 2 |
| Seema| B| 2022-06-07 2022-06-07| 2 |
这里有一个db<>fiddle

x6492ojm

x6492ojm2#

如果你的日期确实是这样格式化的,那么你需要添加一个STR_TO_DATE()函数来重新格式化日期,然后才能运行前面建议的答案。因此:

WITH t1 AS (
  SELECT Name, ID, MAX(STR_TO_DATE(Date, '%d-%m-%Y')), 
        ROW_NUMBER() 
         OVER (PARTITION BY Name ORDER BY MAX(STR_TO_DATE(Date, '%d-%m-%Y')) DESC) AS rn
  FROM customer_history
  GROUP BY Name, ID
)
SELECT * FROM t1 WHERE rn = 2

https://dbfiddle.uk/VdWN5TNq

相关问题