Можете ли вы объединить две таблицы, чтобы получить следующий ряд - PullRequest
0 голосов
/ 04 июня 2019

Попытка написать запрос, который проверит значение, полученное из ряда транзакций.

Таблица A содержит столбцы Code, Date, Value, а таблица B содержит Code, Date, Value.

Обе таблицы содержат несколько экземпляров одного и того же кода.

То, чего я пытаюсь добиться, - это получить каждую строку из таблицы A и присоединить к ней строку из таблицы B, в которой есть тот же элемент запаса, и это первая дата, которая меньше даты таблицы A.

, например

Таблица A

OC001, 2019-01-01, £10

Таблица B имеет

OC001, 2018-10-15, £6
OC001, 2018-11-30, £8
OC001, 2019-01-02, £11

Ожидаемый результат:

OC001, 2019-01-01, £10, OC001, 2018-11-30, £8

Поскольку 2018-11-30 ближе всего к 2019-01-01 и OC001 = OC001

Пробовал разные подходы к объединению, но достиг предела того, что я могу построить.

SELECT
  r.Code,
  cc.StockCode,
  r.Date,
  cc.InvDate
FROM tableA as r
JOIN tableB as cc ON r.Code = cc.StockCode AND r.Date >= cc.InvDate
ORDER BY r.Code, r.Date, cc.InvDate

Запрос работает по большей части, но он дублирует результаты, когда в таблице B. имеется более одного совпадающего результата.

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Я бы определенно посмотрел на функции LAG и LEAD

http://www.sqltutorial.org/sql-window-functions/sql-lag/

SQL LAG () - это оконная функция, которая обеспечивает доступ к строке указанное физическое смещение, которое предшествует текущей строке.

Другими словами, используя функцию LAG () из текущей строки, вы может получить доступ к данным предыдущего ряда или из второго ряда перед текущая строка или от третьей строки до текущей строки и т. д.

Функция LAG () может быть очень полезна для расчета разницы между текущей строкой и предыдущей строкой.

0 голосов
/ 04 июня 2019

Вы присоединяетесь к одной записи для всех записей с одинаковым кодом и равной или большей датой. В этом случае вы, вероятно, получите всегда большой Resultset в зависимости от количества данных, вставленных в вашу базу данных.

Чтобы получить следующую транзакцию, содержащуюся в таблице, вам нужно объединить данные и включить их с наименьшей InvDate:

SELECT r.Code,r.Date,MIN(cc.InvDate) 
FROM tableA as r 
JOIN table B as cc ON r.Code = cc.Code
WHERE r.Date >= cc.InvDate 
GROUP BY r.Code,r.Date

В этом первом случае все записи таблицы a с одинаковым кодом будут объединены с записями таблицы b, а затем отфильтрованы по дате, которая должна быть больше равной. Поскольку, вероятно, будет больше, чем одна запись, соответствующая этому условию, вам просто нужно получить запись с Min (InvDate), которая является следующей по сравнению с записью таблицы A. Группировка по необходима, потому что Min - это агрегатная функция, и поэтому вам нужно сгруппировать все остальные свойства, которые вы хотите выбрать. (Если существует вероятность того, что есть записи с одинаковой датой, добавьте Мин. (ID), поэтому вы просто добавите запись в базу данных первой)

Чтобы выбрать его со значением, используйте:

SELECT r.Code,r.Date,r.Value,MIN(cc.InvDate),cc.Value
FROM tableA as r 
JOIN table B as cc ON r.Code = cc.Code
WHERE r.Date >= cc.InvDate 
GROUP BY r.Code,r.Date,r.Value,cc.Value

Думаю, это должно сработать. Протестировал его с собственной таблицей базы данных, но использовал тот же подход.

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