【问题标题】:View removing history with latest version查看最新版本的删除历史记录
【发布时间】:2020-02-11 10:59:18
【问题描述】:

我有这张桌子:

TABLE S_TEXT:

PS_TEXT     S_TEXT   VS_TEXT        D_TEXT  
1           1        1              Hey                 
2           1        1              Hello
3           1        2              Oh
4           2        1              Hallo
5           2        1              Hallo
6           2        2              Hi

然后我有这个视图来删除所有历史双峰:

CREATE OR REPLACE VIEW `VHS_TEXT`
AS SELECT 
`S_TEXT`.`PS_TEXT`, 
`S_TEXT`.`S_TEXT`, 
`S_TEXT`.`VS_TEXT`, 
`S_TEXT`.`D_TEXT`
FROM 
`S_TEXT` LEFT JOIN 
`S_TEXT` AS `t2`
ON (
`S_TEXT`.`S_TEXT` = `t2`.`S_TEXT` AND `S_TEXT`.`PS_TEXT` < `t2`.`PS_TEXT`
)
WHERE
`t2`.`PS_TEXT` IS NULL;

查看 VHS_TEXT:

PS_TEXT     S_TEXT  VS_TEXT     D_TEXT  
3           1       2           Oh
6           2       2           Hi

然后我有这个视图来显示没有双峰的版本:

CREATE OR REPLACE VIEW `VVS_TEXT`
AS SELECT 
`S_TEXT`.`PS_TEXT`, 
`S_TEXT`.`S_TEXT`, 
`S_TEXT`.`VS_TEXT`, 
`S_TEXT`.`D_TEXT`
FROM 
`S_TEXT` LEFT JOIN 
`S_TEXT` AS `t2`
ON (
`S_TEXT`.`S_TEXT` = `t2`.`S_TEXT`
AND `S_TEXT`.`VS_TEXT` = `t2`.`VS_TEXT`
AND `S_TEXT`.`PS_TEXT` < `t2`.`PS_TEXT`
)
WHERE
`t2`.`PS_TEXT` IS NULL;

查看 VVS_TEXT:

PS_TEXT     S_TEXT   VS_TEXT        D_TEXT  
2           1        1              Hello
3           1        2              Oh
5           2        1              Hallo
6           2        2              Hi

现在我插入一个新的行实例 2 版本 1:

PS_TEXT     S_TEXT   VS_TEXT        D_TEXT  
1           1        1              Hey                 
2           1        1              Hello
3           1        2              Oh
4           2        1              Hallo
5           2        1              Hallo
6           2        2              Hi
7           2        1              Hi too

现在我在 VHS_TEXT 中得到了这个:

PS_TEXT     S_TEXT  VS_TEXT     D_TEXT  
3           1       2           Oh
7           2       1           Hi too

但我想要这个:

 PS_TEXT    S_TEXT  VS_TEXT     D_TEXT  
 3          1       2           Oh
 6          2       2           Hi

所需的查询/视图可以这样定义:

  • 每个不同的 S_TEXT 对应一行
  • 显示带有最新修订版 PS_TEXT 的 S_TEXT 的最新版本 VS_TEXT

【问题讨论】:

    标签: php mysql subquery window-functions sql-view


    【解决方案1】:

    在 MySQL 8.0 中,您可以为此使用 row_number()

    create view vhs_text as
    select ps_text, s_text, vs_text, d_text 
    from (
        select 
            s.*,
            row_number() over(partition by s_text order by vs_text desc) rn
        from s_text s
    ) x
    where rn = 1
    

    Demo on DB Fiddle

    | ps_text | s_text | vs_text | d_text |
    | ------- | ------ | ------- | ------ |
    | 3       | 1      | 2       | Oh     |
    | 6       | 2      | 2       | Hi     |
    

    在早期版本中,您可以将 NOT EXISTS 条件与相关子查询一起使用:

    create view vhs_text as
    select *
    from s_text s
    where not exists (
        select 1 
        from s_text s1
        where s1.s_text = s.s_text and s1.vs_text > s.vs_text
    )
    

    Demo on DB Fiddle(结果相同)

    【讨论】:

    • 是的,但不幸的是我没有 MySQL 8。MySQL 8 无疑是一次重大升级,为 MySQL 世界带来了许多不错的 Oracle 功能 :-)
    • @HenrikHansen:我用早期版本的解决方案更新了我的答案。
    • 它实际上并不能在更大的范围内工作。它仅适用于给定数据,因为最新版本仅存在一个条目。
    • @HenrikHansen:这没有显示在您的示例数据中...您想如何处理该用例?
    • true 样本数据不够全面。但是,用例被解释为在最新版本中获取最新版本,而不是获取最新版本,这可能不是最新版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    相关资源
    最近更新 更多