代码之家  ›  专栏  ›  技术社区  ›  Em Ae

查询以查找给定行或空行的第一个条目

  •  0
  • Em Ae  · 技术社区  · 7 年前

    我有一张包含订单的桌子。任何给定的订单id都可能有多行(表中没有主键)。每个订单也有一个时间戳。

    我收到了一份命令单,说吧 order1 order2 我想找到 第一 这些订单(或日期最早的订单)的条目。如果给定订单id的订单不存在,那么我需要一个只有 order_id .

    在这个例子中,假设 订单1 不存在而且 2017-01-01 ). 我试图进行的查询应该返回这个

    order id|  status  | order time | 
    order2  | received | 2017-01-01 |
    order1  |          |            |
    

    我想我需要一个子查询来首先查找给定的所有订单,然后从中查找最早的订单。但我很难理解并提出这个问题。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Tanveer Uddin    7 年前

    您不需要子查询。使用 window functions 在这种情况下效率更高。现在大多数数据库都支持窗口函数/分析函数。

    另外,假设您正在搜索给定列表的订单,而不是表中的订单列表,请尝试下面的示例查询。这里,“test”表包含您的订单事务记录,数组将包含您试图查找的订单列表。必须使用UNNEST函数将数组转换为行,然后找出测试表中不存在的顺序id。如果可以在另一个表中找到要查找的订单列表,则可以以不同的方式编写查询。

    WITH
    dataset AS (
      SELECT ARRAY[1,2,3,4,5] AS items
    )
    select order_id, status, order_time from
    (
    select order_id, status, order_time, row_number() over (partition by order_id order by order_time ) rn
    from test
    union all
     select orders, null, null, 1 from dataset 
      cross join unnest(items) as t(orders) where orders not in (
          select order_id from test
        )
        )
    where rn = 1