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

zte4gxcn  于 2023-10-18  发布在  Hive
关注(0)|答案(2)|浏览(160)

在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
例如:

  1. select * from (
  2. select Name,`id,lag(id,1) over (partition by Name order by date) as
  3. 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():

  1. WITH t1 AS (
  2. SELECT Name, ID, MAX(Date), ROW_NUMBER() OVER (PARTITION BY Name ORDER BY MAX(Date) DESC) AS rn
  3. FROM customer_history
  4. GROUP BY Name, ID
  5. )
  6. 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()函数来重新格式化日期,然后才能运行前面建议的答案。因此:

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

https://dbfiddle.uk/VdWN5TNq

相关问题