我正在尝试返回一个查询,该查询将为我提供所有用户的倒数第二个交货日期

时间:2019-03-30 21:05:25

标签: sql apache-spark databricks

我正在使用databricks数据库,因此我必须编写一个查询,该查询将返回所有用户倒数第二个订单的delivery_date(即倒数第二个delivery_date)。我拥有所有用户的所有历史交货日期,但我只对所有用户倒数第二个交货日期感兴趣。

我将使用一个简化的示例尝试引导大家完成我要完成的工作。

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

/etc/init.d/oracle-xe-18c start | grep -qc "Oracle Database is not configured

我得到以下结果:

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

我想要的是此用户(及所有其他用户)的倒数第二个交货日期(本例中为2019-03-22),但如果该用户同一天没有一个以上的订单,则会有所不同。 / p>

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

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

但是我收到以下错误:

  

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
        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

我在网上阅读了各种文章,并尝试了不同的查询,但似乎没有任何作用。

2 个答案:

答案 0 :(得分:0)

我想你想要

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

DESC)作为序列号           FROM order.orders o          )o     seqnum = 2;

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

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;

答案 1 :(得分:0)

如果您使用的是DENSE_RANK,它将把这三个不同的日期分组为三个序列号; 1、2、3。如果想获得22nd作为答案,请尝试使用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