SQL - min (дата) с условными выражениями - PullRequest
0 голосов
/ 11 сентября 2018

Мы провели акцию, где пользователи могут получить свой первый заказ на подписку бесплатно. Цена = 0,00 $, когда пользователь использует промо. Меня интересуют данные из примера А.

Пример A - пользователь 50 начал акцию и продолжал ее в течение двух месяцев

order_id  user_id    price    created_at
    1        50       0.00    2018-01-15
    5        50      20.00    2018-02-15
    9        50      20.00    2018-03-15

Пример Б - Пользователь 100 уже был активным подписчиком, который удалил свой аккаунт и повторно активировал акцию, Я не хочу его считать

order_id  user_id    price    created_at
    2        100      20.00    2018-01-16
    3        100       0.00    2018-01-17
    7        100      20.00    2018-02-17

- вот мой запрос -

enter image description here

Возвращает всех пользователей, у которых есть несколько заказов

ГДЕ хотя бы один из их заказов имеет цену = 0,00

-Этот набор данных возвращает пример A и пример B

- Мой вопрос -

Большая часть этих данных верна (пример A), но несколько из них я хочу опустить, поскольку они искажают мои данные (пример B). Я хочу удалить пользователей примера B.

Я хочу удалить людей, которые первым заказом не были промо.

Как я могу запросить, чтобы их ПЕРВЫЙ заказ имел цену = 0,00? Я думал что-то с min (create_at)?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Вы можете использовать EXISTS, чтобы проверить, что для записи с нулевой ценой ранее не существует created_at:

SELECT COUNT(*), user_id
FROM Promo
WHERE user_id IN (
    -- Query below yields [user_id]s of users who got the promo
    -- that wasn't a result of a cancellation and re-activation
    SELECT user_id
    FROM Promo p
    WHERE p.price = 0 AND NOT EXISTS (
        -- Look for a record with the same user ID and an earlier date
        -- than p.created_at, which is the date of the promo with 0.00 price
        SELECT *
        FROM Promo pp
        WHERE pp.user_id=p.user_id AND pp.created_at < p.created_at
    )
)
GROUP BY user_id
0 голосов
/ 11 сентября 2018

Вы можете получить время первого заказа, используя:

select user_id, min(created_at) as min_ca
from t
group by user_id;

Далее вы можете узнать цену первого заказа, используя:

select oi.*
from order_items oi join
     (select user_id, min(created_at) as min_ca
      from order_items oi
      group by user_id
     ) ooi
     on oi.user_id = ooi.user_id and oi.created_at = ooi.min_ca
where oi.price = 0.00;

Затем вы можете получить все записи, используя join, in или exists;

select oi.*
from order_items oi join
     order_items oi1
     on oi.user_id = oi1.user_id join
     (select user_id, min(created_at) as min_ca
      from order_items oi
      group by user_id
     ) u1
     on oi1.user_id = u1.user_id and oi1.created_at = u1.min_ca
where oi1.price = 0.00;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...