SQL: сложный вопрос для поиска дат блокировки - PullRequest
0 голосов
/ 05 декабря 2018

Надеюсь, вы можете помочь.У нас есть таблица с двумя столбцами Customer_ID и Trip_Date.Клиент получает 15% скидку при первом посещении и при каждом посещении, когда он не получил 15% скидку за последние тридцать дней.Как написать один SQL-запрос, который находит все дни, когда клиент получил 15% скидку?

Таблица выглядит следующим образом

+-----+-------+----------+
| Customer_ID | date     |
+-----+-------+----------+
|          1  | 01-01-17 |
|          1  | 01-17-17 |
|          1  | 02-04-17 |
|          1  | 03-01-17 |
|          1  | 03-15-17 |
|          1  | 04-29-17 |
|          1  | 05-18-17 |
+-----+-------+----------+

Желаемый результат будет выглядеть следующим образом:

+-----+-------+----------+--------+----------+
| Customer_ID | date     | received_discount |
+-----+-------+----------+--------+----------+
|          1  | 01-01-17 |        1          |
|          1  | 01-17-17 |        0          |
|          1  | 02-04-17 |        1          |
|          1  | 03-01-17 |        0          |
|          1  | 03-15-17 |        1          |
|          1  | 04-29-17 |        1          |
|          1  | 05-18-17 |        0          |
+-----+-------+----------+--------+----------+

Мы делаем эту работу в Netezza.Я не могу придумать, как использовать только оконные функции, использовать только рекурсию и циклы.Есть какой-то умный трюк, который мне не хватает?

Заранее спасибо, GF

1 Ответ

0 голосов
/ 05 декабря 2018

Вы не сообщили нам, какой у вас бэкэнд, не дали несколько примеров данных и ожидаемого вывода, а также не представили разумную схему данных :( Это пример, основанный на предположении схемы с использованием postgreSQL в качестве бэкэнда (было бы слишком грязно)как комментарий): (Я думаю, у вас есть Customer_Id, Trip_Date и LocationId в таблице поездок?)

select * from trips t1
where not exists (
  select * from trips t2 
  where t1.Customer_id = t2.Customer_id and
  t1.Trip_Date > t2.Trip_Date 
  and t1.Trip_date - t2.Trip_Date < 30
);
...