我正在使用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
我在网上阅读了各种文章,并尝试了不同的查询,但似乎没有任何作用。
答案 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