【问题标题】:Mysql Join get Latest value of each group [duplicate]Mysql加入获取每个组的最新值[重复]
【发布时间】:2023-01-21 20:26:14
【问题描述】:

Mysql版本:8.0.21

我正在寻找每个具有“水果”类型的“TableData”的最新值。

Table Name: TableNames
 _________________________________________
| id | name         | id_group  |   type  |
|-----------------------------------------| 
| 0  | AppleGroup   | apple     |  fruit  |
| 1  | BananaGroup  | banana    |  fruit  |
| 2  | OtherGroup   | other     |  other  |


Table Name: TableData
 __________________________
| id |  id_group  | value  | 
|--------------------------| 
| 0  | apple      |  12    |
| 1  | banana     |  8     |
| 2  | apple      |  3     | <--get latest
| 3  | banana     |  14    |
| 4  | banana     |  4     | <--get latest

通过此查询,我得到了所有项目,但我正在寻找每个项目中的最新项目。 我已经尝试过分组依据和排序依据,但问题是我首先需要排序依据然后分组依据,这在 Mysql 中似乎是不可能的。

SELECT 
  n.name,
  d.value
  FROM TableNames n
  INNER JOIN
  (
    SELECT *
    FROM TableData
  ) d ON d.`id_group` = n.`id_group` 
  WHERE type = 'fruit'

Expected ouput:
 _____________________
| name        | value |     
|---------------------|
| AppleGroup  | 3     |
| BananaGroup | 4     |

任何帮助将不胜感激

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    在 MySQL 8+ 上,我们可以使用 ROW_NUMBER()

    WITH cte AS (
        SELECT tn.name, tn.id_group, td.value,
               ROW_NUMBER() OVER (PARTITION BY tn.id_group ORDER BY td.id DESC) rn
        FROM TableNames tn
        INNER JOIN TableData td
            ON td.id_group = tn.id_group
        WHERE tn.type = 'fruit'
    )
    
    SELECT name, value
    FROM cte
    WHERE rn = 1
    ORDER BY id_group;
    

    【讨论】:

      猜你喜欢
      • 2019-11-20
      • 2017-09-12
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 2018-10-06
      相关资源
      最近更新 更多