我正在尝试返回一个查询,它将为我提供所有用户的倒数第二个delivery_dates

问题描述 投票:1回答:2

我正在使用数据库数据库,我必须编写一个查询,它将返回所有用户的倒数第二个订单的delivery_date(所以倒数第二个delivery_date)。我拥有所有用户的所有历史delivery_date,但我只对所有用户的倒数第二个delivery_date感兴趣。

我将尝试使用简化的示例向您介绍我想要完成的任务。

当我为一个用户运行下面的代码时。

SELECT delivery_date_local
FROM order.orders 
WHERE lower(customer_login_visits) = '<my-email-here>@gmail.com'

我得到以下结果:

Delivery_date_local
2019-03-22
2019-03-22
2019-03-22
2019-03-22
2019-03-21
2019-03-20

我想要的是这个用户(和所有其他用户)的倒数第二个delivery_date_local,在这种情况下是2019-03-22,但如果用户在同一天没有多个订单,则会有所不同。

这是我正在运行的查询,以获得基于a query I found on Stack Overflow的所需结果。

SELECT 
    DISTINCT(customer_login),
    MAX (delivery_date_local) as Last_order_date,
    MAX(case when seqnum = 2 then delivery_date_local end) as Penultimate_order_date
FROM (
    SELECT
        DENSE_RANK() OVER(PARTITION BY customer_login_visits DESC) as seqnum
    FROM order.orders
)order.orders
WHERE seqnum IN (1,2)
GROUP BY customer_login_visits

但是我收到以下错误:

SQL语句出错:ParseException: 来自'期待'的输入'不匹配(第5行,第0位)

Select distinct  (customer_login),

           MAX(delivery_date_local) as Last_order_date,

           max(case when seqnum = 2 then

           delivery_date_local end) as Penultimate_order_date

from           (select 
^^^

我在线阅读了各种帖子并尝试了不同的查询,但似乎没有任何效果。

sql apache-spark databricks
2个回答
0
投票

我想你想要:

SELECT o.*
FROM (SELECT o.*,
             DENSE_RANK() OVER (PARTITION BY customer_login_visits ORDER BY Delivery_date_local 

DESC)as seqnum FROM order.orders o)o WHERE seqnum = 2;

这实际上返回倒数第二个日期的所有订单。如果你只想要日期,那么使用`select distinct:

SELECT DISTINCT customer_login_visits, Delivery_date_local
FROM (SELECT o.*,
             DENSE_RANK() OVER (PARTITION BY customer_login_visits ORDER BY Delivery_date_local DESC) as seqnum
      FROM order.orders o
     ) o
WHERE seqnum = 2;

0
投票

如果您使用的是DENSE_RANK,它会将这三个不同的日期分为三个序列号; 1,2,3。如果你想获得第22个作为答案,那么尝试使用ROW_NUMBER代替,例如:

SELECT *
FROM
  (
  SELECT ROW_NUMBER() OVER( PARTITION BY customer_login_visits ORDER BY delivery_date_local DESC ) AS seqnum, 
  customer_login_visits,
  delivery_date_local
  FROM order.orders
  )
WHERE seqnum = 2
© www.soinside.com 2019 - 2024. All rights reserved.