Este é um problema que me deparo com bastante frequência e que adoraria saber como resolver.
Estou escrevendo um relatório/consulta que é bastante simples, mas quando executado, retorna linhas com valores duplicados. Eu sei que o motivo pelo qual essas "duplicatas" são retornadas é porque há uma coluna que possui dados diferentes entre as duas linhas, mas digamos que eu só queira ver 1 linha retornada com um número de ID específico. Não importa qual linha é selecionada, apenas 1 linha é retornada para cada ID_NUM.
Exemplo simplificado de dados retornados:
ID_NUM | PHASE | DATE | NOTE
----------------------------------
30329 | Phase1 | 1-1-20 | example note
30329 | null | 1-1-20 | example note
21928 | Phase1 | 1-2-20 | another note
21928 | Phase1 | 4-3-19 | another note
O que eu tentei:
- SELECT DISTINCT - retorna o mesmo resultado que SELECT simples
- SELECT DISTINCT MIN(ID_NUM) - ainda retorna valores ID_NUM duplicados, acho que porque são os mesmos, não há min.
- GROUP BY ID_NUM - requer que eu inclua todas as colunas do grupo por e ainda retorne o mesmo resultado.
Exemplo real: Embora o exemplo acima seja um exemplo simplificado, o abaixo mostra minha consulta real. cases.casenum é o campo/coluna que preciso de apenas 1 linha retornada para cada valor único. Este é um banco de dados sybase, que segue a sintaxe mssql/t-sql.
SELECT cases.casenum,
cases.case_date_5,
cases.class,
user_tab6_data.trial_phase,
user_tab6_data.maximizer_completed,
user_tab6_data.maximizer_scheduled,
cases.case_title,
cases.open_status, cases.case_date_9,
user_tab6_data.maximizer_necessary,
cases.staff_1,
cases.staff_8,
user_tab6_data.county_of_suit,
insurance.how_settled,
insurance.policy_type,
insurance.date_settled,
user_tab6_data.value_set_date,
user_tab6_data.status_note,
user_tab6_data.minimum_value
FROM cases, user_tab6_data, insurance
WHERE (cases.casenum = user_tab6_data.case_id)
AND (cases.casenum = insurance.case_num)
AND (cases.class like 'A' OR cases.class like 'B' OR cases.class like 'C' OR cases.class like 'D' OR cases.class like 'E' OR cases.class like 'F' OR cases.class like 'G' OR cases.class like 'H' OR cases.class like 'I' OR user_tab6_data.trial_phase like 'Phase 1' OR cases.case_date_5 is not NULL )
AND insurance.policy_type = 'Liability'
AND cases.open_status = 'O'
AND cases.case_date_9 is not NULL
Tente usar a função de janela ROW_NUMBER como neste exemplo: