Возвращает одну запись для каждого критерия

#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