【问题标题】:Getting other fields after using MAX PostgreSQL function使用 MAX PostgreSQL 函数后获取其他字段
【发布时间】:2022-11-21 19:05:16
【问题描述】:

我有一个 orders 表,它有一个主键 id 列、一个 order_id 列和一个 created_date 列:

===================================
              ORDERS
===================================

id | order_id |    created_date
-----------------------------------
 1 |   178    | 2022-11-16 09:25:11
 2 |   182    | 2022-11-18 08:44:19
 3 |   178    | 2022-11-17 11:16:22
 4 |   178    | 2022-11-18 14:55:41
 5 |   195    | 2022-11-15 09:11:17
 6 |   195    | 2022-11-16 21:22:32
 7 |   146    | 2022-11-16 16:55:09
 8 |   178    | 2022-11-16 04:39:16
 9 |   121    | 2022-11-16 01:20:19

我想编写一个查询,为特定的 order_id 返回最高的 created_date,所以我尝试使用 MAX()。但我也想返回最高created_date行的id。在上面的示例中,假设我想返回符合此条件的订单 ID 178 的行:

SELECT   MAX(o.created_date),
         o.id
FROM     orders o
WHERE    o.order_id = 178
GROUP BY o.id;

问题是,当我像这样编写查询时,会返回多行。我试过完全删除 GROUP BY 但除此之外,我无法理解我需要对此查询执行的操作以显示以下信息:

4 | 2022-11-18 14:55:41

我如何编写 PostgreSQL 查询来显示具有最高 created_date 值的行,同时显示该行的其他信息?

【问题讨论】:

  • 这是什么时间戳:) 2022-11-16 04:39:76

标签: sql postgresql greatest-n-per-group


【解决方案1】:

您将不得不使用 CTE 来计算哪个是最新的 order_id,使用 ROW_NUMBER() 和正确的 ORDER BY。之后,使用这个伪排序器选择整行。

WITH ranked_order_ids_by_date AS (
  SELECT 
    *, 
    ROW_NUMBER() over (PARTITION BY order_id ORDER BY created_date DESC) AS date_rank
  FROM USERS
)
SELECT *
FROM ranked_order_ids_by_date
WHERE order_id = 178
  AND date_rank = 1

dbfiddle

【讨论】:

    【解决方案2】:

    您可以为此使用 PostgreSQL 的专有 distinct on ()

    select distinct on (order_id) *
    from orders o
    where order_id = 178
    order by order_id, created_date desc
    

    【讨论】:

      【解决方案3】:

      如果您不关心多个 order_id 具有相同的最新日期,您可以只使用 LIMIT

      SELECT id, order_id, created_date
      FROM orders
      WHERE order_id = 178
      ORDER BY created_date DESC
      LIMIT 1;
      

      我可能会出现不同的订单 ID,而您想获取所有订单 ID,请使用窗口函数,例如 DENSE_RANK

      WITH o AS
      (
       SELECT orders.*, DENSE_RANK() 
        OVER (PARTITION BY order_id ORDER BY created_date DESC) AS sub
         FROM orders
        WHERE order_id = 178
      )
      SELECT id, order_id, created_date
        FROM o
       WHERE sub = 1
      

      【讨论】:

      • 如果您将limit更改为fetch first 1 row with ties,您甚至会得到具有相同最高值的created_date
      猜你喜欢
      • 1970-01-01
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多