Вычислить разницу, используя ближайшую (самую старую дату), используя тот же столбец

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть (упрощенная) таблица базы данных A ниже, которая содержит как значение чистоты материнской партии, так и чистоту партии (все партии сделаны из предыдущей «материнской партии».

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

Таблица A

 Sample Name    |  Purity   |  Date (DD/MMM/YY)  
--------------- ----------- -----------------  
Mother Batch   |    100    |10-Oct-20  
   Batch 1     |    96     |11-Oct-20  
   Batch 2     |    94     |13-Oct-20  
Mother Batch   |    98     |14-Oct-20  
   Batch 1     |    94     |16-Oct-20  

Many thanks
Bob
  

Комментарии:

1. Как найти мать? Только по дате? Или у вас есть соединительный столбец?

2. Нет, только по дате, поэтому результат будет чем-то (например, я добавляю сюда столбцы математики) Пакет 1 4 (100-96) Пакет 2 6 (100-4) Пакет 1 4 (98-94)

Ответ №1:

Используйте функции условного окна:

 select t.*,
       datediff(date,
                max(case when samplename like 'Mother%' then date end) over (order by date)
               ) as diff
from t;
  

Редактировать:

В SQL Server вы бы использовали:

        datediff(day,
                max(case when samplename like 'Mother%' then date end) over (order by date),
                date
               ) as diff
  

Комментарии:

1. И если у меня есть дополнительные столбцы или имена примеров в этом столбце / таблице? (извините, возможно, это упростило)

2. @BobS . , , Та же идея должна работать. Я имею в виду, вы можете ограничить разницу только «пакетными» строками, но это кажется незначительным изменением ( case выражением).

3. Спасибо, Гордон, не могли бы вы указать, как это может выглядеть с точки зрения кода? Большое спасибо

4. @BobS . . . Это отвечает на вопрос, который вы задали здесь. Если у вас есть следующий вопрос о разных данных, задайте новый вопрос с соответствующими образцами данных и желаемыми результатами.

5. Подойдет. Вышеуказанные ошибки с Datediff требуют трех частей