SQL Join 2 таблицы с разницей в датах - PullRequest
1 голос
/ 26 мая 2019

У меня есть 2 таблицы, одна из которых - заказы, а другая - квитанции.Проблема, с которой я сталкиваюсь, заключается в том, что у них нет UID, единственное, к чему они могут присоединиться, это дата.Проблема в том, что дата одна и та же, но разница во времени между ними составляет около 30 секунд.У меня вопрос, есть ли способ, как я могу присоединиться к этим 2 таблицам?

Итак, первая таблица имеет следующий формат

|   date        | order | price | 
|1/1/13 06:05:32|  tea  |   3   |
|1/2/13 07:04:24| coffee|   2   |
|4/3/13 13:31:23|  tea  |   3   |

И вторая таблица имеет этот формат

|   date        | order | quantity | 
|1/1/13 06:05:42|  tea  |   3      |
|1/2/13 07:04:54| coffee|   2      |
|4/3/13 13:31:56|  tea  |   3      |

Мой желаемый результат -

|   date        | order | quantity |  price | 
|1/1/13 06:05:42|  tea  |   3      |    3   |
|1/2/13 07:04:54| coffee|   2      |    2   |
|4/3/13 13:31:56|  tea  |   3      |    3   |

По сути, моя цель здесь состоит в том, чтобы объединить эти 2 таблицы, чтобы я мог видеть различия между ними, но у меня нет идеи, как объединить их безуникальные идентификаторы, помогите, пожалуйста, ребята

Ответы [ 4 ]

1 голос
/ 27 мая 2019

Вот одно решение (пробовал на SQLite3, но оно аналогично для других СУБД, если вы заменили на соответствующую функцию даты):

create table orders([date],[order],price);
insert into orders values
('2013-01-01 06:05:32', 'tea',  3),
('2013-01-02 07:04:24','coffee',2),
('2013-04-03 13:31:23', 'tea',  3);

create table receipts([date],[order],quantity);
insert into receipts values
('2013-01-01 06:05:42', 'tea',  3),
('2013-01-02 07:04:54','coffee',2),
('2013-04-03 13:31:56', 'tea',  3);

-- My desired output is
--
-- |   date        | order | quantity |  price |
-- |1/1/13 06:05:42|  tea  |   3      |    3   |
-- |1/2/13 07:04:54| coffee|   2      |    2   |
-- |4/3/13 13:31:56|  tea  |   3      |    3   |

select r.[date],[order],quantity,price
  from orders o join receipts r using([order])
  where r.date > o.date
    and r.date < datetime(o.date,'+40 seconds')

или даже:

select r.[date],[order],quantity,price
  from orders o join receipts r using([order])
  where r.date between o.date and datetime(o.date,'+40 seconds')

Я использовал 40 секунд (вы говорите, примерно 30 секунд, но ваш пример выводит разницу в 33 секунды). Отрегулируйте по мере необходимости. Я также предполагаю (основываясь на вашем примере), что заказы всегда идут раньше поступлений.

0 голосов
/ 26 мая 2019

Вы можете перечислить по значению даты и присоединиться к этому:

select t2.*, t1.*
from (select t1.*, row_number() over (partition by product order by date) as seqnum
      from t1
     ) t1 join
     (select t2.*, row_number() over (partition by product order by date) as seqnum
      from t2
     ) t2 
     on t1.product = t2.product and
        t1.seqnum = t2.seqnum;

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

select t2.*, t1.*
from t2 join
     t1
     on t2.product = t1.product and
        t2.date >= dateadd(second, -30, t1.date) and
        t2.date < dateadd(second, 30, t1.date);

Или использовать apply, чтобы получитьближайшее время до t2:

select t2.*, t1.*
from t2 outer appy
     (select top (1) t1.*
      from t1
      where t1.product = t2.product and
            t1.date <= t2.date and
            t1.date > dateadd(second, -60, t2.date)  -- just to keep within a range
      order by t1.date desc
     ) t1;
0 голосов
/ 26 мая 2019

Если вы можете убедиться, что порядок данных в обеих таблицах будет всегда одинаковым, я имею в виду, что номер строки X в таблице1 всегда принадлежит номеру строки X в таблице2, тогда вы можете использовать row_number и JOIN для обеих таблиц, используя ROW_NUMBER. Это может быть вариант.

SELECT A.Date, A.Order, A.Price, B.quantity
FROM 
(
    SELECT  Date, Order, Price,
    ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN
    FROM Table1
)A
INNER JOIN 
(
        SELECT  Date, Order, quantity,
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN
)B ON A.RN = B.RN
0 голосов
/ 26 мая 2019

на сервере sql вы можете сделать что-то вроде этого:

select *
from ( select *, convert(date, getdate()) as d1 from t1) as t1,
( select *, convert(date, getdate()) as d2 from t2) as t2
where t1.d1 = t2.d2
and t1.order = t2.order

смысл в том, чтобы преобразовать дату и время только в дату и объединить две таблицы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...