Как устранить дубликаты в результате выбора с Inner-Join? - PullRequest
1 голос
/ 16 мая 2019

Я хотел бы знать, как разыгрывать дубликаты во ВНУТРЕННЕМ СОЕДИНЕНИИ.

Кстати, у меня есть запрос, который возвращает мне 23 миллиона строк этой формы:

field1      field2      field3      field4      field5
  a           k           c           u           j
  o           y           c           t           m
  r           k           z           u           d
  a           k           c           x           w
  d           y           q           t           h

Я хочу удалить строки, в которых field2 и field4 имеют одинаковое значение, и сохранить в качестве первой строки этих дубликатов. Результат, который я ожидал, был:

field1      field2      field3      field4      field5
  a           k           c           u           j
  o           y           c           t           m
  a           k           c           x           w

Ниже моего кода, к которому я хочу применить это лечение. Мне нужна помощь и предложения в нижней части моего кода. Спасибо

    SELECT 
    cd_box,
    cd_charact,
    txt_charact_value,
    row_id,
    val_charact_value,
    dttm_charact_value,
    cd_param,
    val_charact
FROM (
    SELECT 
         code_element AS cd_box,
         code_caracteristique, 
         valeur_t AS txt_charact_value, 
         null as row_id,
         valeur_n AS val_charact_value,
         valeur_d AS dttm_charact_value, 
         index_tableau AS val_charact, 
         valeur_liste,
         code_type_element,
         cd_charact,
         cd_param,
         code_caracteristique_metro
    FROM (
        SELECT 
             code_element,
             code_caracteristique, 
             valeur_texte, 
             valeur_num, 
             valeur_date, 
             index_tableau, 
             valeur_liste,
             code_type_element,
             idtype_valeur,
             CASE  
                WHEN (idtype_valeur=1 OR idtype_valeur=2) AND (valeur_texte!='null' AND valeur_texte='t') THEN 'OUI'
                WHEN (idtype_valeur=1 OR idtype_valeur=2) AND (valeur_texte!='null' AND valeur_texte='f') THEN 'NON'
                --ELSE 'null'
             END AS valeur_t,
             CASE  
                WHEN (idtype_valeur=9 OR idtype_valeur=10 OR idtype_valeur=11) THEN TO_CHAR(valeur_num)
                --ELSE 'null'
             END AS valeur_n,
             CASE  
                WHEN (idtype_valeur=3 OR idtype_valeur=5) THEN TO_CHAR(valeur_date)
                --ELSE 'null'
             END AS valeur_d
        FROM (
            SELECT 
                code_element,
                code_caracteristique, 
                valeur_texte, 
                valeur_num, 
                valeur_date, 
                index_tableau, 
                valeur_liste,
                code_type_element,
                idtype_valeur
            FROM (
                SELECT 
                  ec.code_element, 
                  ec.code_caracteristique, 
                  ec.valeur_texte, 
                  ec.valeur_num, 
                  ec.valeur_date, 
                  ec.index_tableau, 
                  ec.valeur_liste,
                  e.code_type_element
                FROM 
                  stg_element_caracteristique ec,   
                  stg_element e,
                  stg_caracteristique c,
                  stg_modele_caracteristique mc
                WHERE e.code=ec.code_element AND c.name = ec.code_caracteristique
                AND c.idmodele_caracteristique = mc.id 
                AND mc.idtype_valeur != 6
                AND (ec.valeur_liste='null' OR ec.valeur_liste is null)
                AND ec.code_caracteristique!='TE_GENER_DATE_MES'
            ) table1
            INNER JOIN (
                SELECT 
                  stg_caracteristique.name, 
                  stg_type_element.code,
                  stg_modele_caracteristique.idtype_valeur
                FROM 
                  stg_caracteristique, 
                  stg_type_element,
                  stg_modele_caracteristique
                WHERE 
                  stg_caracteristique.idtype_element = stg_type_element.id 
                  AND stg_modele_caracteristique.id = stg_caracteristique.idmodele_caracteristique   
                  AND stg_type_element.code != 'TE_GENER'
                ORDER BY stg_type_element.code
            ) table2
            ON (table1.code_caracteristique = table2.name AND table1.code_type_element = table2.code)
        ) 
    ) charact1
    INNER JOIN ( --le dernier lk
        SELECT 
          cd_code as cd_charact,
          code_param as cd_param,
          code_caracteristique_metro
        FROM 
          stg_reprisemaskeqrevu
    ) row1 
    ON (charact1.code_caracteristique = row1.code_caracteristique_metro) 
) WHERE cd_box IS NOT NULL OR cd_box!='null'

1 Ответ

1 голос
/ 16 мая 2019

Таблицы SQL представляют неупорядоченные наборы. first value отсутствует, если только в столбце не указан порядок. Позвольте мне предположить такой столбец, хотя я оставлю ? в качестве заполнителя для имени.

Тогда вы в основном хотите использовать row_number():

select t.*
from (select t.*,
             row_number() over (partition by field2, field4 order by ?) as seqnum
      from t
     ) t
where seqnum = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...