#sql #tsql
#sql #tsql
Вопрос:
Я борюсь с решением для получения одной записи для каждого критерия. В прилагаемом примере я хотел бы получить одну запись для каждого «nbr». Я начал с этого, но я не могу получить то, что мне нужно.
SELECT t2.*,
CASE
WHEN t2.duplicate_flag=1 AND (t2.country=t2.country_active OR t2.country=t2.country_inactive) THEN 1 ELSE t2.duplicate_flag END nbr_match
FROM
(SELECT t1.*,
CASE d.duplicate WHEN 1 THEN 1 ELSE 999 END duplicate_flag
FROM [Sheet1$] t1
JOIN
(SELECT nbr, COUNT(*) as duplicate
FROM [Sheet1$]
GROUP BY nbr) d
ON t1.nbr=d.nbr) t2
Как я уже сказал, я хотел бы получить одну запись для каждого «nbr».
Если у меня есть одна запись для «nbr», это нормально, и я отмечу ее «1». Для остальных, у которых есть дубликаты (count (*)> 1), я буду отмечать как «99», а затем изменять эти «99» на основе условий, чтобы получить одну запись.
Это правила, которым я должен следовать, чтобы получить одну запись для каждого «nbr»:
1. IF "country"="country_active" return me that row (per "nbr")
2. ELSEIF "country"="country_inactive" return me that row
3. If I have two the same countries between the "country" and the "country_active" THEN look at the MAX "expiration_date_active" OR MAX "expiration_date_inactive" and return me that record.
4. IF there is no match between "country"<>"country_active" AND "country"<>"country_inactive" return the column with the MAX date either from "expiration_date_active" OR "expiration_date_inactive"
Итоговая таблица или выходные данные должны выглядеть следующим образом:
Заранее благодарю вас за помощь.
Исходные данные:
Комментарии:
1. Я не могу добавить файл Excel, поэтому я вставил всю таблицу в конец исходной таблицы вопроса.
2. Не публикуйте изображения ваших данных. Найдите время, чтобы опубликовать ее в виде инструкций DDL и DML или, по крайней мере, в табличном формате
text
. Не ожидайте, что здешние пользователи будут расшифровывать ваши данные за вас.3. Пожалуйста, опубликуйте это как fiddle или вставьте фактические данные.
4. Я удалил данные изображения, но все еще не знаю, как добавить сюда данные таблицы. Я создал ее здесь ozh.github.io/ascii-tables , но если вы можете объяснить мне, как вставить это сюда. Я пытаюсь, но это не будет вставляться как оригинал. Спасибо.
Ответ №1:
Обеспечивает ли это результаты, которые вы ожидаете?
WITH ListOfNbr AS (SELECT DISTINCT nbr FROM [Sheet1$])
SELECT t2.*
FROM ListOfNbr t1
CROSS APPLY (
SELECT TOP 1 *
FROM [Sheet1$]
WHERE nbr = t1.nbr
ORDER BY
CASE WHEN country = country_active THEN 1 ELSE 0 END DESC,
CASE WHEN country = country_inactive THEN 1 ELSE 0 END DESC,
expiration_date_active DESC,
expiration_date_inactive DESC
) t2