Умножить на последние предыдущие значения из других таблиц - PullRequest
0 голосов
/ 25 июня 2019

У меня возникла проблема при умножении значения на другое последнее (но не на ту же дату) значение из другой таблицы с тем же ключом.

Для простоты понимания я объясню это ниже.

Предположим, у нас есть две таблицы variables и coefficients:

table coefficients

date            key     coeff
-----------------------------
2019-06-01      A       1
2019-06-02      B       2
2019-06-03      A       3
2019-06-05      B       4
2019-06-06      B       5
2019-06-08      A       6

table variables

date            key     var
---------------------------
2019-06-02      A       7
2019-06-05      B       8
2019-06-05      A       9
2019-06-06      B       10
2019-06-07      A       11
2019-06-08      B       12
2019-06-09      A       13

цель состоит в том, чтобы умножить значение в столбце variable на ближайшее предыдущее значение coeff.

В итоге мы получим результат:

---------------------------
date            key     val     <-- var *   coeff   
---------------------------
2019-06-02      A       7       <-- 7   *   1       
2019-06-05      B       16      <-- 8   *   2
2019-06-05      A       27      <-- 9   *   3
2019-06-06      B       40      <-- 10  *   4
2019-06-07      A       33      <-- 11  *   3
2019-06-08      B       60      <-- 12  *   5
2019-06-09      A       78      <-- 13  *   6

На variablesтаблица, первая строка (ключ A) была датирована 2019-06-02, поэтому мы умножаем variables.var на предыдущую последнюю (не ту же дату) coefficients.coeff на A, то есть 2019-06-01 's coeff.То же самое со вторым рядом B.

Я не знаю, с чего начать запрос, поскольку, если мы join, он на каждом key кажется не работает.

Ответы [ 3 ]

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

Быстрое и грязное решение для этого:

SELECT
   result.[date],
   result.[key],
   result.[var] * result.[coeff] AS val
FROM (
   SELECT
      v.[date],
      v.[key],
      v.[var],
      (SELECT
         c.coeff
      FROM
         dbo.coefficients c
      WHERE
         c.[key] = v.[key]
      AND
         c.[date] = (SELECT MAX(c1.[date])
                     FROM dbo.coefficients c1
                     WHERE c1.[key] = v.[key] AND c1.[date] < v.[date])) AS coeff
   FROM
      dbo.variables v
) result

Вы можете написать функцию для ближайшей даты:

CREATE FUNCTION dbo.ClosestDate(
   @key nvarchar(1),
   @date date
)
RETURNS date
AS
BEGIN
   DECLARE @result date

   SELECT @result = MAX(c.[date]) FROM dbo.coefficients c WHERE c.[key] = @key AND c.[date] < @date

   RETURN @result
END

Тогда вы можете написать запрос как:

SELECT
   v.[date],
   v.[key],
   v.[var] * c.coeff AS [val]
FROM
   dbo.variables v
   INNER JOIN dbo.coefficients c ON c.[key] = v.[key] AND c.[date] = dbo.ClosestDate(v.[key], v.[date])
0 голосов
/ 25 июня 2019

Я рекомендую outer apply:

select v.*, (c.coeff * v.var)
from variables v outer apply
     (select top (1) c.*
      from coefficients c
      where c.date <= v.date
      order by c.date desc
     ) v;
0 голосов
/ 25 июня 2019

Попробуйте этот код ниже, чтобы получить ожидаемый результат. Подзапрос выберет значение coeff для соответствующего ключа с учетом coefficients.date меньше, чем variables.Date.

Вы можете проверить скрипку Демо здесь .

SELECT A.date,
A.[key],
A.var * ISNULL( 
(
    SELECT TOP 1 coeff
    FROM coefficients B  
    WHERE B.[key] = A.[key] 
    AND B.date < A.date 
    ORDER BY B.date DESC 
),1) val
FROM variables A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...