#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 требуют трех частей