mysql - 连接后另一个表的第二低值

标签 mysql sql sql-server oracle hive

我需要帮助来解决这个特定的 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/

相关文章:

mysql - 在子查询 where 子句中引用列

sql - PostgreSQL:一次运行多个选择

php - sql查询不适用于三个表连接

sql-server - Sql Server中如何跟踪表结构的变化

mysql - 如何将数字四舍五入到最接近的 10?

"where"的 php mysql 查询错误

mysql - 维护数据库中唯一值的列表

用于 alter table alter columns IDENTITY(1,1) 的 sql server helper 存储过程或实用程序

sql-server - 在不调用 SQLGetData() 的情况下获取未绑定(bind)列的指标值

mysql - 检测更新查询是否来自触发器