我需要帮助来解决这个特定的 sql 问题,我无法编写存储过程,因为我需要将其移植到 Hive。
有两个 tQCles Contr 和 Lvl,我需要将它们左连接,并使用前一行的值填充连接的 tQCle 中 LVL 的空值。 我的样本 tQCles 位于
Contr
| id | EFF_DT | M_NBR | ACTY_SEQ_NBR | L_CD |
|---------|------------|-------|--------------|------|
| QQFAE46 | 2000-12-24 | 11 | 1 | POT |
| QQFAE46 | 2000-12-24 | 11 | 2 | POT |
| QQFAE46 | 2000-12-24 | 11 | 3 | POT |
| QCC5433 | 2013-04-21 | 00 | 1 | MIC |
| QCC5433 | 2013-04-21 | 00 | 2 | MIC |
| QCC614E | 2015-07-18 | 00 | 1 | MIC |
| QCC614E | 2015-07-18 | 00 | 4 | MIC |
| QC56DDF | 1999-10-01 | 14 | 2 | POT |
| QC56DDF | 1999-10-01 | 14 | 3 | POT |
| QC56DDF | 1999-10-01 | 14 | 4 | POT |
| ACB3DC2 | 1999-10-01 | 14 | 1 | POT |
LVL
| id | EFF_DT | M_NBR | ACTY_SEQ_NBR | OCCR |
|---------|------------|-------|--------------|------|
| QQFAE46 | 2000-12-24 | 11 | 1 | 100 |
| QQFAE46 | 2000-12-24 | 11 | 3 | 100 |
| QCC5433 | 2013-04-21 | 00 | 2 | 200 |
| QCC614E | 2015-07-18 | 00 | 3 | 200 |
| QC56DDF | 1999-10-01 | 14 | 1 | 0 |
LEFT JOIn of Contr and Lvl
| id | EFF_DT | M_NBR | ACTY_SEQ_NBR | L_CD | id | EFF_DT | M_NBR | ACTY_SEQ_NBR | OCCR |
|---------|------------|-------|--------------|------|---------|------------|--------|--------------|--------|
| QQFAE46 | 2000-12-24 | 11 | 1 | POT | QQFAE46 | 2000-12-24 | 11 | 1 | 100 |
| QQFAE46 | 2000-12-24 | 11 | 2 | POT | (null) | (null) | (null) | (null) | (null) |
| QQFAE46 | 2000-12-24 | 11 | 3 | POT | QQFAE46 | 2000-12-24 | 11 | 3 | 100 |
| QCC5433 | 2013-04-21 | 00 | 1 | MIC | (null) | (null) | (null) | (null) | (null) |
| QCC5433 | 2013-04-21 | 00 | 2 | MIC | QCC5433 | 2013-04-21 | 00 | 2 | 200 |
| QCC614E | 2015-07-18 | 00 | 1 | MIC | (null) | (null) | (null) | (null) | (null) |
| QCC614E | 2015-07-18 | 00 | 4 | MIC | (null) | (null) | (null) | (null) | (null) |
| QC56DDF | 1999-10-01 | 14 | 2 | POT | (null) | (null) | (null) | (null) | (null) |
| QC56DDF | 1999-10-01 | 14 | 3 | POT | (null) | (null) | (null) | (null) | (null) |
| QC56DDF | 1999-10-01 | 14 | 4 | POT | (null) | (null) | (null) | (null) | (null) |
| ACB3DC2 | 1999-10-01 | 14 | 1 | POT | (null) | (null) | (null) | (null) | (null) |
现在我需要用值填充 LVl tQCle 中的空 ACTY_SEQ_NBR 的值。 标准是,从 CONTR(即从连接的 tQCle 的第 4 列)找到相应的 ACTY_SEQ_NBR,并从 LVL 中找到 ACTY_SEQ_NBR,其中 ACTY_SEQ_NBR 较小 对于相同的 id、eff_dt 和 m_nbr,小于或等于 CONTR ACTY_SEQ_NBR 的值。
对于。例如Row#2的ACTY_SEQ_NBR为空,其对应的Contr ACTY_SEQ_NBR为2,LVL中小于2的ACTY_SEQ_NBR值为1。
所以我的理想输出应该像这一行一样。
| id | EFF_DT | M_NBR | ACTY_SEQ_NBR | L_CD | id | EFF_DT | M_NBR | ACTY_SEQ_NBR | OCCR |
|---------|------------|-------|--------------|------|---------|------------|--------|--------------|--------|
| QQFAE46 | 2000-12-24 | 11 | 1 | POT | QQFAE46 | 2000-12-24 | 11 | 1 | 100 |
| QQFAE46 | 2000-12-24 | 11 | 2 | POT | (null) | (null) | (null) | 1 | (null) |
I tried a lag query but its not giving correct output for all values.
我执行了 Amniders 查询,并更改了结果以获得预期值。 这是我的期望值
| ID | EFF_DT | M_NBR | ACTY_SEQ_NBR | L_CD | LVL_ID | LVL_EFF_DT | LVL_M_NBR | LVL_ACTY_SEQ_NBR | OCCR | CALC_LVL_ACTY_SEQ_NBR |
|---------|------------|-------|--------------|------|---------|------------|-----------|------------------|--------|-----------------------|
| QQFAE46 | 2000-12-24 | 11 | 1 | POT | QQFAE46 | 2000-12-24 | 11 | 1 | 100 | 1 |
| QQFAE46 | 2000-12-24 | 11 | 2 | POT | (null) | (null) | (null) | (null) | (null) | 1 |
| QQFAE46 | 2000-12-24 | 11 | 3 | POT | QQFAE46 | 2000-12-24 | 11 | 3 | 100 | 3 |
| QC56DDF | 1999-10-01 | 14 | 2 | POT | (null) | (null) | (null) | (null) | (null) | 1 |
| QC56DDF | 1999-10-01 | 14 | 3 | POT | (null) | (null) | (null) | (null) | (null) | 1 |
| QC56DDF | 1999-10-01 | 14 | 4 | POT | (null) | (null) | (null) | (null) | (null) | 1 |
| QCC5433 | 2013-04-21 | 00 | 1 | MIC | (null) | (null) | (null) | (null) | (null) | -99 |
| QCC5433 | 2013-04-21 | 00 | 2 | MIC | QCC5433 | 2013-04-21 | 00 | 2 | 200 | 2 |
| QCC614E | 2015-07-18 | 00 | 1 | MIC | (null) | (null) | (null) | (null) | (null) | -99 |
| QCC614E | 2015-07-18 | 00 | 4 | MIC | (null) | (null) | (null) | (null) | (null) | 3 |
| ACB3DC2 | 1999-10-01 | 14 | 1 | POT | (null) | (null) | (null) | (null) | (null) | -99 |
感谢任何帮助
最佳答案
试试这个:
SELECT
ID, EFF_DT, M_NBR, ACTY_SEQ_NBR, L_CD, LVL_ID, LVL_EFF_DT, LVL_M_NBR, LVL_ACTY_SEQ_NBR, OCCR
,COALESCE(CASE WHEN LVL_ACTY_SEQ_NBR IS NULL THEN COALESCE(LAG(ACTY_SEQ_NBR) OVER (PARTITION BY ID, EFF_DT, M_NBR ORDER BY ACTY_SEQ_NBR),ACTY_SEQ_NBR) ELSE LVL_ACTY_SEQ_NBR END,'NA') LVL_NMBR
FROM(
SELECT A.ID, A.EFF_DT, A.M_NBR, A.ACTY_SEQ_NBR, A.L_CD
, B.ID LVL_ID, B.EFF_DT LVL_EFF_DT, B.M_NBR LVL_M_NBR, B.ACTY_SEQ_NBR LVL_ACTY_SEQ_NBR , B.OCCR
FROM EDWT.CONTR A
LEFT JOIN EDWT.LVL B
ON A.ID = B.ID AND A.ACTY_SEQ_NBR = B.ACTY_SEQ_NBR and a.eff_dt=b.eff_dt and a.m_nbr=b.m_nbr ) A;
此外,请帮助确定以下行的有效值:
ID EFF_DT M_NBR ACTY_SEQ_NBR L_CD LVL_ID LVL_EFF_DT LVL_M_NBR LVL_ACTY_SEQ_NBR OCCR LVL_NMBR
ABC5433 2013-04-21 00 1 IMC 1
您期望 ABC614E 和 ABC5433 的 lvl_acty_seq_nbr 获得哪些数据。 ABC614E 在 lvl 表中没有 acty_Seq_nbr,并且在 contr 中具有 1 和 4。请提供上述 id 的预期输出。您想要相同 id 内的最低值还是所有 id 中的最低值?
关于mysql - 连接后另一个表的第二低值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33534458/