Я пытаюсь вернуть запрос, который даст мне предпоследнюю дату доставки для всех пользователей. - PullRequest
1 голос
/ 31 марта 2019

Я работаю с базой данных блоков данных, и мне нужно написать запрос, который будет возвращать 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, но будет другим, если у пользователя не будет более одного заказа в тот же день.

Это запрос, к которому я выполняюполучить желаемые результаты, основанные на запросе, который я нашел в переполнении стека .

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:
несоответствующий ввод 'from' ожидаемый (строка 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 
^^^

Я прочитал несколько постов в Интернете и пробовал разные запросы, но, похоже, ничего не работает.

Ответы [ 2 ]

0 голосов
/ 31 марта 2019

Если вы используете 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
0 голосов
/ 31 марта 2019

Я думаю, что вы хотите:

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

DESC) как последовательность ОТ заказа. Заказы ) o ГДЕ seqnum = 2;

Это фактически возвращает все заказы на предпоследнюю дату. Если вы хотите указывать только дату, используйте команду «Выбрать отличное»:

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