【问题标题】:SELECT rows with MAX id minus 1 with group by选择 MAX id 减去 1 的行,分组依据
【发布时间】:2022-01-21 04:08:29
【问题描述】:

我有一个表,其中包含 id、city_id 和 stock,如下所示。

id city_id stock
1 1 1000
2 2 500
3 3 11000
4 2 600
5 3 12000
6 1 2000
9 3 13000
10 1 3000
11 1 4000
12 2 700

要为每个 city_id 选择最新的股票值,我使用了以下查询,效果很好。

SELECT `stock` 
FROM `stock_table` 
WHERE id in ( SELECT MAX(id) 
              FROM `stock_table` 
              GROUP BY city_id 
             );

返回

stock
13000
4000
700

现在我想为每个 city_id 选择第二个最新的股票条目。所以输出应该如下表所示。

stock
12000
3000
600

非常感谢任何帮助。谢谢!

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    在 MySQL 8 中,您可以使用row_number() 窗口函数为id 的每个分区city_id 排序的每一行分配一个数字。然后只需过滤 2 (在您的示例中;您可以使用任何数字)。

    SELECT x.stock 
           FROM (SELECT s.stock,
                        row_number() OVER (PARTITION BY s.city_id
                                           ORDER BY s.id DESC) rn
                        FROM stock_table s) x
           WHERE x.rn = 2;
    

    【讨论】:

    • 谢谢,非常感谢。
    【解决方案2】:

    你可以使用 group by 与行号并获得行号 2 ROW_NUMBER() OVER (PARTITION BY city_id ORDER By id) as ROW

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      • 2011-12-10
      • 1970-01-01
      • 2011-09-12
      • 2020-09-28
      • 1970-01-01
      相关资源
      最近更新 更多