【发布时间】:2022-01-16 16:06:53
【问题描述】:
我需要一些帮助来解决这个问题。
假设我有下表:
| contract_id | tariff_id | product_category | date (DD.MM.YYYY) | month (YYYYMM) |
|---|---|---|---|---|
| 123456 | ABC | small | 01.01.2021 | 202101 |
| 123456 | ABC | medium | 01.02.2021 | 202102 |
| 123456 | DEF | small | 01.03.2021 | 202103 |
| 123456 | DEF | small | 01.04.2021 | 202104 |
| 123456 | ABC | big | 01.05.2021 | 202105 |
| 123456 | DEF | small | 01.06.2021 | 202106 |
| 123456 | DEF | medium | 02.06.2021 | 202106 |
| 123456 | DEF | medium | 01.07.2021 | 202107 |
该表由month 分区。
这是我的表格的一部分,其中包含多个contract_ids。
我试图找出每个contract_id,因为它有最新的tariff_id,自从它有product_category_id='small'(如果它没有小产品类别,那么值应该是@ 987654328@).
结果将写入每个月更新的表格中。
所以对于上面的表格,我的最新结果应该是这样的:
| contract_id | same_tariff_id_since | product_category_small_since |
|---|---|---|
| 123456 | 01.06.2021 | NULL |
我正在使用 Hive。
到目前为止,我只能为same_tariff_id_since想出这个解决方案:
问题是它给了我绝对的min(date) tariff_id 而不是min(date),因为最近的tariff_id。
我认为product_category_small_since 的代码将具有大致相同的逻辑。
我当前的代码是:
SELECT q2.contract_id
, q3.tariff_id
, q2.date
FROM (
SELECT contract_id
, max(date_2) AS date
FROM (
SELECT contract_id
, date
, min(date) OVER (PARTITION BY tariff_id ORDER BY date) AS date_2
FROM given_table
)q1
WHERE date=date_2
GROUP BY contract_id
)q2
JOIN given_table AS q3
ON q2.contract_id=q3.contract_id
AND q2.date=q3.date
提前致谢。
【问题讨论】: