【问题标题】:Want to generate a row_number variable in MySQL 5.6 - but not using @variables想要在 MySQL 5.6 中生成 row_number 变量 - 但不使用 @variables
【发布时间】:2021-12-23 20:35:05
【问题描述】:

我有一张桌子(所有代码都在fiddle)。

id   nom    bal     bal_dt      val_dt
 1  Bill    75.00   2019-11-01  2020-03-31
 1  Bill    100.00  2020-04-01  2020-07-31
 1  Bill    500.00  2020-08-01  2021-11-11  -- record goes over New Year 2021
 2  Ben       5.00  2019-11-01  2020-03-31
 2  Ben      10.00  2020-04-01  2020-07-31
 2  Ben     100.00  2020-08-01  2021-11-11  -- record goes over New Year 2021
6 rows

主键是 (id, bal_dt) - 每天只有一笔存款。

我想在 2021 年新年(或 最后条记录。

我尝试来自here 的代码如下。

select a2.id, a2.nom, a2.val_dt,
(select count(*) from account a1 where a1.id < a2.id) AS rn 
from account a2
where a2.val_dt <= '2021-01-01 00:00:00'
order by val_dt desc;

但结果并不好。

id   nom    val_dt      rn
 1  Bill    2020-07-31  0
 2  Ben     2020-07-31  3
 1  Bill    2020-03-31  0
 2  Ben     2020-03-31  3

我想要类似的东西

id nom  rn val_dt     bal
 1 Bill  1 2020-08-01 500.00
 2 Ben   1 2020-08-01 100.00

所以我为比尔和本选择了唱片。请问有什么帮助吗?

注意 - 我不需要 @variables 并且不假设只有 3 条记录或只有 2 个帐户,而且日期不同,而不仅仅是最后日期!

【问题讨论】:

    标签: mysql sql subquery mysql-5.6


    【解决方案1】:

    您可以使用NOT EXISTS 和相关子查询来检查所需时间段内是否缺少较年轻的时间戳。

    SELECT a1.id,
           a1.nom,
           a1.val_dt
           FROM account a1
           WHERE a1.val_dt < '2021-01-01 00:00:00'
                 AND NOT EXISTS (SELECT *
                                        FROM account a2
                                        WHERE a2.val_dt < '2021-01-01 00:00:00'
                                              AND a2.val_dt > a1.val_dt
                                              AND a2.id = a1.id);
    

    请注意,2021-01-01 00:00:00 已经在 2021 年,因此操作员实际上需要是 &lt; 而不是 &lt;=

    【讨论】:

    • 不,我年初需要钱!如果在 2021 年的第一刻有存款,则必须是金额。会看查询。谢谢。
    • @SQL_Padawan:好吧,但是“我想在 2021 年新年之前获得 最后一个记录”的描述在技术上并不正确......
    【解决方案2】:

    解决了(见fiddle)!

    select
      tab.id, tab.md, a2.bal
    from account a2
    join
    (
      select 
        a1.id, max(a1.bal_dt) AS md
      from account a1
      where a1.bal_dt <= '2021-01-01 00:00:00'
      group by a1.id
    ) as tab
    on a2.id = tab.id and a2.bal_dt = tab.md;
    

    和。

    id          md  bal
    1   2020-08-01  500.00
    2   2020-08-01  100.00
    

    【讨论】:

      猜你喜欢
      • 2019-10-05
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      相关资源
      最近更新 更多