Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为每个客户机选择第一个和第n个订单_Sql_Postgresql_Pivot_Left Join_Greatest N Per Group - Fatal编程技术网

Sql 为每个客户机选择第一个和第n个订单

Sql 为每个客户机选择第一个和第n个订单,sql,postgresql,pivot,left-join,greatest-n-per-group,Sql,Postgresql,Pivot,Left Join,Greatest N Per Group,我试图为每个用户显示第一个和第五个订单id 表如下所示: +----------+-----------+-------------------+ | Order_ID | Client_ID | Datetime | +----------+-----------+-------------------+ | 1 | 1 | YYYYMMDD HH:MM:SS | +----------+-----------+-----------------

我试图为每个用户显示第一个和第五个订单id

表如下所示:

+----------+-----------+-------------------+
| Order_ID | Client_ID | Datetime          |
+----------+-----------+-------------------+
| 1        | 1         | YYYYMMDD HH:MM:SS |
+----------+-----------+-------------------+
| 2        | 1         | YYYYMMDD HH:MM:SS |
+----------+-----------+-------------------+
| 3        | 2         | YYYYMMDD HH:MM:SS |
+----------+-----------+-------------------+
select 
  t.client_id, 
  t.order_id as first_order, 
  t2.order_id as fifth_order,
  t.datetime as first_dt,
  t2.datetime as fifth_dt,
from
(
  select o.client_id, o.order_id, o.datetime,
  row_number() over(partition by o.client_id order by o.datetime) as rn
  from "OhMyTable" as o
) as t
  left join
    (
  select o.client_id, o.order_id, o.datetime,
  row_number() over(partition by o.client_id order by o.order_id) as rn
  from "OhMyTable" as o
      order by o.order_id
  ) as t2
  on t.client_id = t2.client_id
where t.rn = 1 and t2.rn = 5
我写了这样的东西:

+----------+-----------+-------------------+
| Order_ID | Client_ID | Datetime          |
+----------+-----------+-------------------+
| 1        | 1         | YYYYMMDD HH:MM:SS |
+----------+-----------+-------------------+
| 2        | 1         | YYYYMMDD HH:MM:SS |
+----------+-----------+-------------------+
| 3        | 2         | YYYYMMDD HH:MM:SS |
+----------+-----------+-------------------+
select 
  t.client_id, 
  t.order_id as first_order, 
  t2.order_id as fifth_order,
  t.datetime as first_dt,
  t2.datetime as fifth_dt,
from
(
  select o.client_id, o.order_id, o.datetime,
  row_number() over(partition by o.client_id order by o.datetime) as rn
  from "OhMyTable" as o
) as t
  left join
    (
  select o.client_id, o.order_id, o.datetime,
  row_number() over(partition by o.client_id order by o.order_id) as rn
  from "OhMyTable" as o
      order by o.order_id
  ) as t2
  on t.client_id = t2.client_id
where t.rn = 1 and t2.rn = 5

但我想看到那些第一次下订单却没有五分之一订单的客户。应该有空值,但我不知道如何使它c

其中t2.rn=5
条件放入
左连接中

选择
t、 客户id,
t、 订单id作为第一个订单,
t2.订单id作为第五订单,
t、 日期时间作为第一个日期,
t2.datetime作为第五个日期,
从…起
(
选择o.client\u id、o.order\u id、o.datetime、,
作为rn的行(按o.client划分的分区\u id按o.datetime排序)
从“欧姆表”改为o
)as t
左连接
(
选择o.client\u id、o.order\u id、o.datetime、,
(按o.client\u id按o.order\u id分区)上的行号()作为rn
从“欧姆表”改为o
按订单号订购
)as t2
在t.client\u id=t2.client\u id上
t2.rn=5
其中t.rn=1,t2.datetime为空

如果发现条件聚合比两个子查询更简单。您可以使用
having
子句进行筛选:

select client_id,
    max(order_id) filter(where rn = 1) first_order,
    max(order_id) filter(where rn = 5) fifth_order,
    min(datetime) first_dt,
    max(datetime) fifth_dt
from (
    select o.client_id, o.order_id, o.datetime,
        row_number() over(partition by o.client_id order by o.datetime) as rn
    from "OhMyTable" as o
) t
where rn in (1, 5)
group by client_id
having count(*) = 2

使用条件聚合:

select o.client_id,
       min(datetime) as first_datetime,
       max(datetime) as fifth_datime,
       max(case when seqnum = 1 then order_id end) as first_orderid,
       max(case when seqnum = 5 then order_id end) as fifth_orderid
from (select o.*
             row_number() over(partition by o.client_id order by o.datetime) as seqnum
      from "OhMyTable" o
     ) o
where seqnum in (1, 5);