Присоединяйтесь к таблицам на даты, когда даты разные - PullRequest
0 голосов
/ 16 января 2019

Так что в основном мне было интересно, как я могу объединить две таблицы по датам, если они разные. Первая таблица - это мои основные таблицы, в которые входят все мои клиенты, которые купили товары. Дата покупки единственного очка в прошлом:

Customers
    +--------+----------+-------+------------+
    | custid | Quantity | Price | ReportDate |
    +--------+----------+-------+------------+
    | 371965 |       12 |     2 | 9/1/2016   |
    | 371965 |        2 |     5 | 2/25/2018  |
    | 377958 |       45 |     3 | 9/1/2016   |
    | 270723 |       12 |  1.25 | 5/1/2014   |
    | 270723 |    10.86 |  1.25 | 6/1/2014   |
    | 270723 |    12.29 |   1.3 | 7/1/2014   |
    | 270723 |    12.29 |   1.4 | 9/15/2016  |
    +--------+----------+-------+------------+

Итак, я хотел бы присоединиться к таблицам моих клиентов на столе со скидками. Время, в течение которого действовала скидка, - это, по сути, весь период до получения новой скидки:

Discounts
    +----+-----------+----------+
    | id | startdate | discount |
    +----+-----------+----------+
    |  1 | 7/18/2013 |      0.1 |
    |  2 | 1/10/2014 |     0.25 |
    |  3 | 7/11/2016 |     0.11 |
    |  4 | 9/14/2016 |     0.12 |
    |  5 | 1/12/2017 |     0.15 |
    |  6 | 2/6/2017  |     0.22 |
    |  7 | 6/28/2017 |     0.09 |
    +----+-----------+----------+

Поэтому моя цель - связать обе таблицы и посмотреть, какая дата покупки попадает в соответствующий интервал скидок. Это будет моей целью:

+--------+----------+-------+------------+----+-----------+----------+
| custid | Quantity | Price | ReportDate | id | startdate | discount |
+--------+----------+-------+------------+----+-----------+----------+
| 371965 |       12 |     2 | 9/1/2016   |  3 | 7/11/2016 |     0.11 |
| 371965 |        2 |     5 | 2/25/2018  |  7 | 6/28/2017 |     0.09 |
| 377958 |       45 |     3 | 9/1/2016   |  3 | 7/11/2016 |     0.11 |
| 270723 |       12 |  1.25 | 5/1/2014   |  2 | 41649     |     0.25 |
| 270723 |    10.86 |  1.25 | 6/1/2014   |  2 | 1/10/2014 |     0.25 |
| 270723 |    12.29 |   1.3 | 7/1/2014   |  2 | 1/10/2014 |     0.25 |
| 270723 |    12.29 |   1.4 | 9/15/2016  |  4 | 9/14/2016 |     0.12 |
+--------+----------+-------+------------+----+-----------+----------+

Я ценю вашу помощь !!!!!!

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Вы можете присоединиться так:

select c.*, d.*
from customers c inner join discounts d
on d.startdate = (select max(startdate) from discounts where startdate <= c.reportdate)

См. Демоверсию

0 голосов
/ 16 января 2019

Просто еще один вариант

;with cte as (
Select A.* 
      ,B.*
      ,RN = row_number() over (Partition by custid,reportdate order by startdate desc)
 From Customers A
 Join Discounts B on B.startdate<=A.ReportDate
) 
Select * 
 From  cte 
 Where RN=1

dbFiddle

0 голосов
/ 16 января 2019

Вы можете использовать OUTER APPLY, чтобы выбрать ТОП 1 Скидку, существовавшую до даты отчета, упорядоченную по убыванию даты, чтобы получить самую последнюю операцию

  SELECT C1.*,DQ.*  FROM CUSTOMERS C1 OUTER APPLY 
                 (SELECT TOP 1 D.* FROM Discounts D WHERE C1.ReportDate >= D.startDate  
                                       ORDER BY D.StartDate DESC) DQ
...