none
Obter resultado mais atual, sem dados repetidos. RRS feed

  • Pergunta

  • Cometi um equívoco, esqueci de uma parte bem importante no filtro, que sem ela não irá funcionar, vou tentar ser mais objetivo e refazer a pergunta.

    Preciso obter o resultado que está na cor verde:

    Preciso que siga as regras:

    • motivo_envio: Tem que ser TROCA%
    • status: Tem que ser ANOMALIA
    • imei: Tem que ser único

    Critério:

    • data_importacao: Tem que ser a maior (mais recente)

    OBS:

    • Se caso o registro mais atual daquele IMEI estiver com o STATUS igual PENDENTE ou LIBERADO não quero pegar esse resultado, somente se o mais atual estiver com ANOMALIA

    Exemplificando:

    1. IMEI 1111111111 aparece 2 vezes, a primeira vez que apareceu estava com STATUS igual ANOMALIA, mas depois ele apareceu com STATUS igual PENDENTE, ou seja não quero mais, porque esse IMEI o status mais recente dele foi PENDENTE e não ANOMALIA.
    2. IMEI 2222222222 é a mesma coisa do IMEI 1111111111, aparece 2 vezes, a primeira com STATUS igual ANOMALIA mas depois aparece com o STATUS mais recente de PENDENTE, então não preciso dele também.
    3. IMEI 3333333333 e 4444444444 também não preciso, pois o STATUS mais atual é PENDENTE, só precisaria se o STATUS dele fosse ANOMALIA.
    4. IMEI 5555555555 aparece pela primeira vez com STATUS igual ANOMALIA e depois aparece pela segunda vez com o STATUS de ANOMALIA, então preciso dele (o que for o mais recente).

    Criei um arquivo com o CREATE e INSERT desses registros para poder facilitar:

    https://pastebin.com/raw/44f2cECt

    Peço desculpas pelo erro, esqueci de mencionar essa parte importante e crucial para esse filtro, desde já agradeço a ajuda!



    • Editado Sup3r-Us3r sexta-feira, 30 de agosto de 2019 22:48
    quinta-feira, 29 de agosto de 2019 00:05

Respostas

  • No caso o 2º e 3º registros o que diferem seriam as datas, eu preciso da que for mais atual,

    E qual coluna de data que é utilizada para saber qual linha é mais atual: data_importacao ou data_alteracao?

    O que significa a coluna gsm?

    As colunas gsm, cpf e contrato devem estar com o mesmo valor, para decidir se há ou não linha repetida?

    Um cpf pode ter mais de um contrato?

    ---

    Eis uma possibilidade:

    --- código #1
    with agTEMP as (
    SELECT *,
           seq= row_number() over (partition by gsm, cpf, contrato, imei 
                                   order by data_alteracao desc)
      from tbTEMP
      where motivo_envio like 'TROCA%'
    )
    SELECT gsm, cpf, contrato, motivo_envio, data_ativacao, data_importacao, data_alteracao, status, imei
      from agTEMP
      where seq = 1;
     


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Marcado como Resposta Sup3r-Us3r quinta-feira, 29 de agosto de 2019 01:07
    • Editado José Diz quinta-feira, 29 de agosto de 2019 01:54
    quinta-feira, 29 de agosto de 2019 00:14
  • Boa noite,

    Experimente fazer uns testes mais ou menos dessa forma:

    with CTE_RN as
    (
        select
            *,
            row_number() over(partition by imei order by data_alteracao desc) as RN
        from Tabela
        where 
            motivo_envio like 'TROCA%'
    )
    
    select * from CTE_RN 
    where RN = 1

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Sup3r-Us3r quinta-feira, 29 de agosto de 2019 01:07
    quinta-feira, 29 de agosto de 2019 00:19
  • Sup3r-Us3r,

    Quando você se refere as datas, qual das três seria a utilizada como parâmetro de alteração?

    Tomei como base os dados que você compartilhou, realizei a importação para minha máquina e estão dispostos conforme a Figura 1 ilustra a seguir:

    Desta forma, elaborei um simples exemplo fazendo uso do comando Group By em conjunto com a função de agregação Max() para obter a maior data para cada coluna data, veja o exemplo abaixo:

    Select GSM, CPF, Contrato, Motivo_Envio, 
               Max(data_ativacao) As DataAtivacao, 
               Max(data_importacao) As DataImportacao, 
               Max(data_alteracao) As DataAlteracao, 
    	   status, 
    	   imei 
    From Dados
    Group By GSM, CPF, Contrato, Motivo_Envio, status, imei
    Order By DataAtivacao Desc

    Após executar o select acima temos o seguinte resultado apresentado na Figura 2 abaixo:

    Ressalto que este é somente um exemplo, uma das diversas possibilidades que podemos aplicar, como também, não garanto que o resultado obtido seja o que você deseja.

    Espero ter ajudado.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Sup3r-Us3r quinta-feira, 29 de agosto de 2019 01:04
    • Não Marcado como Resposta Sup3r-Us3r quinta-feira, 29 de agosto de 2019 01:05
    • Marcado como Resposta Sup3r-Us3r quinta-feira, 29 de agosto de 2019 01:06
    quinta-feira, 29 de agosto de 2019 00:29
    Moderador
  • O critério que define o status atual daquele IMEI é a data_importacao mesmo, e referente a regra preciso pegar somente se a linha mais atual estiver com ANOMALIA.

    Experimente:

    -- código #1 v2
    with agTEMP as (
    SELECT *,
           seq= row_number() over (partition by gsm, cpf, contrato, imei 
                                   order by data_importacao desc)
      from tbTEMP
      where motivo_envio like 'TROCA%'
    )
    SELECT gsm, cpf, contrato, motivo_envio, data_ativacao, data_importacao, data_alteracao, status, imei
      from agTEMP
      where seq = 1
            and status = 'ANOMALIA';
     


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Marcado como Resposta Sup3r-Us3r sexta-feira, 30 de agosto de 2019 15:33
    • Editado José Diz sexta-feira, 30 de agosto de 2019 16:55
    sexta-feira, 30 de agosto de 2019 14:45
  • Opa gapimex, lembro de você também, já me ajudou e muito em outra dúvida que tinha, e trouxe mais uma vez uma solução para esse meu problema, agradeço a você e ao José, uma dúvida, eu posso usar esse cenário (essa query que você criou) todas as vezes que eu precisar obter o registro mais atual, seguindo o critério da especificada o ROW_NUMBER OVER() ou RANK() OVER() serve para qual finalidade? criar uma ranking literalmente para cada linha encontrada tipo isso?

    Coluna | Ranking

    A | 1

    B | 2

    C | 3

    e o PARTITION BY ele meio que separa cada linha para poder ser trabalhada de forma independente? o DESC serviu para usar pegar o maior para o menor correto?poderia me explicar a lógica disso por gentileza? desde já agradeço a atenção!

    Sup3r-Us3r,

    As Funções Row_Number() e Rank() você perguntou são definidas como funções de ranqueamento de dados que nos permitem estabelecer ordem de classificação de dados mas que muitas vezes não podem ser tratadas como determinísticas. Estas funções de classificação retornam um valor de classificação para cada linha em uma partição. Dependendo da função usada, algumas linhas podem receber o mesmo valor que outras.

    Segundo a documentação official Microsoft:

    Rank: Retorna a classificação de cada linha na partição de um conjunto de resultados. A classificação de uma linha é um valor mais o número de classificações que vêm antes da linha em questão.
    Se duas ou mais linhas empatarem em uma classificação, cada linha empatada receberá a mesma classificação.

    Row_Number(): Definem a saída de um resultado de números, mais especificamente, retorna o número sequencial de uma linha dentro de uma partição de um conjunto de resultados, começando em 1 para a primeira linha em cada partição. ROW_NUMBER e RANK são semelhantes.

    - Em ROW_NUMBER todos os números em sequência linhas (por exemplo 1, 2, 3, 4, 5); e
    - RANK fornece o mesmo valor numérico para as faixas (por exemplo 1, 2, 2, 4, 5), já a
    ROW_NUMBER é um valor temporário calculado quando a consulta é executada.

    Em relação ao Over() é mais conhecida como uma cláusula que você pode utilizar para as funções de agregação, ranking e analísticas, servindo com um element capaz de determinar o particionamento dos dados, bem como, as formas de ordenação aplicada a coluna.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Sup3r-Us3r quinta-feira, 29 de agosto de 2019 01:55
    quinta-feira, 29 de agosto de 2019 01:17
    Moderador

Todas as Respostas

  • No caso o 2º e 3º registros o que diferem seriam as datas, eu preciso da que for mais atual,

    E qual coluna de data que é utilizada para saber qual linha é mais atual: data_importacao ou data_alteracao?

    O que significa a coluna gsm?

    As colunas gsm, cpf e contrato devem estar com o mesmo valor, para decidir se há ou não linha repetida?

    Um cpf pode ter mais de um contrato?

    ---

    Eis uma possibilidade:

    --- código #1
    with agTEMP as (
    SELECT *,
           seq= row_number() over (partition by gsm, cpf, contrato, imei 
                                   order by data_alteracao desc)
      from tbTEMP
      where motivo_envio like 'TROCA%'
    )
    SELECT gsm, cpf, contrato, motivo_envio, data_ativacao, data_importacao, data_alteracao, status, imei
      from agTEMP
      where seq = 1;
     


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Marcado como Resposta Sup3r-Us3r quinta-feira, 29 de agosto de 2019 01:07
    • Editado José Diz quinta-feira, 29 de agosto de 2019 01:54
    quinta-feira, 29 de agosto de 2019 00:14
  • Boa noite,

    Experimente fazer uns testes mais ou menos dessa forma:

    with CTE_RN as
    (
        select
            *,
            row_number() over(partition by imei order by data_alteracao desc) as RN
        from Tabela
        where 
            motivo_envio like 'TROCA%'
    )
    
    select * from CTE_RN 
    where RN = 1

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Sup3r-Us3r quinta-feira, 29 de agosto de 2019 01:07
    quinta-feira, 29 de agosto de 2019 00:19
  • Sup3r-Us3r,

    Quando você se refere as datas, qual das três seria a utilizada como parâmetro de alteração?

    Tomei como base os dados que você compartilhou, realizei a importação para minha máquina e estão dispostos conforme a Figura 1 ilustra a seguir:

    Desta forma, elaborei um simples exemplo fazendo uso do comando Group By em conjunto com a função de agregação Max() para obter a maior data para cada coluna data, veja o exemplo abaixo:

    Select GSM, CPF, Contrato, Motivo_Envio, 
               Max(data_ativacao) As DataAtivacao, 
               Max(data_importacao) As DataImportacao, 
               Max(data_alteracao) As DataAlteracao, 
    	   status, 
    	   imei 
    From Dados
    Group By GSM, CPF, Contrato, Motivo_Envio, status, imei
    Order By DataAtivacao Desc

    Após executar o select acima temos o seguinte resultado apresentado na Figura 2 abaixo:

    Ressalto que este é somente um exemplo, uma das diversas possibilidades que podemos aplicar, como também, não garanto que o resultado obtido seja o que você deseja.

    Espero ter ajudado.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Sup3r-Us3r quinta-feira, 29 de agosto de 2019 01:04
    • Não Marcado como Resposta Sup3r-Us3r quinta-feira, 29 de agosto de 2019 01:05
    • Marcado como Resposta Sup3r-Us3r quinta-feira, 29 de agosto de 2019 01:06
    quinta-feira, 29 de agosto de 2019 00:29
    Moderador
  • Muito obrigado José, você me ajudou uma vez e me ajudou hoje novamente, agradeço de coração, deu certinho, em relação as perguntas que me fez, gsm seria o número de telefone, que pode ou não se repetir, o cpf e contrato também pode ser variáveis, mas o que decide mesmo esse filtro seria o imei, pois ele tem que ser único, e caso não for preciso obter o registro mais atual seguindo aquelas colunas de datas, a correta seria de data_ativacao, por exemplo nesse cenário que mostrei teve 3 registros, 2 se repetindo e nesse que se repetiu precisou do mais atual porque o imei é único e não pode se repetir, agora o outro registro já teve imei único, ele não se repetiu, não sei se deu para compreender bem, é um pouco confuso rsrs, mas agradeço a atenção, tenha uma excelente noite, vlw!
    quinta-feira, 29 de agosto de 2019 00:52
  • Opa gapimex, lembro de você também, já me ajudou e muito em outra dúvida que tinha, e trouxe mais uma vez uma solução para esse meu problema, agradeço a você e ao José, uma dúvida, eu posso usar esse cenário (essa query que você criou) todas as vezes que eu precisar obter o registro mais atual, seguindo o critério da especificada o ROW_NUMBER OVER() ou RANK() OVER() serve para qual finalidade? criar uma ranking literalmente para cada linha encontrada tipo isso?

    Coluna | Ranking

    A | 1

    B | 2

    C | 3

    e o PARTITION BY ele meio que separa cada linha para poder ser trabalhada de forma independente? o DESC serviu para usar pegar o maior para o menor correto?poderia me explicar a lógica disso por gentileza? desde já agradeço a atenção!

    quinta-feira, 29 de agosto de 2019 01:01
  • Minha dúvida é quais colunas utilizar para decidir o que funcionaria como "chave única". Um assinante tem um contrato; ao longo desse contrato ele pode trocar de aparelho (o que é usual) mas pode também trocar de número de telefone (o que acho que não é tão usual, enquanto cliente de uma mesma operadora).  Além disso, um aparelho que estava com um assinante pode depois ser vendido para outro assinante, no caso de promoção de troca de aparelho.  Ou seja, um mesmo IMEI pode estar em cpf/contrato diferentes mas em períodos distintos.

    No código que propus utilizei as colunas { gsm, cpf, contrato, imei } como "chave única" e a coluna data_alteracao como critério para definir o que é mais recente. Acho que a coluna data_ativacao não pode ser utilizada pois, pelo menos no exemplo que postou, elas têm o mesmo valor.

    Se puder testar o código utilizando uma amostra maior facilitaria analisar se o código está correto ou não.


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.


    • Editado José Diz quinta-feira, 29 de agosto de 2019 01:11
    quinta-feira, 29 de agosto de 2019 01:09
  • Opa gapimex, lembro de você também, já me ajudou e muito em outra dúvida que tinha, e trouxe mais uma vez uma solução para esse meu problema, agradeço a você e ao José, uma dúvida, eu posso usar esse cenário (essa query que você criou) todas as vezes que eu precisar obter o registro mais atual, seguindo o critério da especificada o ROW_NUMBER OVER() ou RANK() OVER() serve para qual finalidade? criar uma ranking literalmente para cada linha encontrada tipo isso?

    Coluna | Ranking

    A | 1

    B | 2

    C | 3

    e o PARTITION BY ele meio que separa cada linha para poder ser trabalhada de forma independente? o DESC serviu para usar pegar o maior para o menor correto?poderia me explicar a lógica disso por gentileza? desde já agradeço a atenção!

    Sup3r-Us3r,

    As Funções Row_Number() e Rank() você perguntou são definidas como funções de ranqueamento de dados que nos permitem estabelecer ordem de classificação de dados mas que muitas vezes não podem ser tratadas como determinísticas. Estas funções de classificação retornam um valor de classificação para cada linha em uma partição. Dependendo da função usada, algumas linhas podem receber o mesmo valor que outras.

    Segundo a documentação official Microsoft:

    Rank: Retorna a classificação de cada linha na partição de um conjunto de resultados. A classificação de uma linha é um valor mais o número de classificações que vêm antes da linha em questão.
    Se duas ou mais linhas empatarem em uma classificação, cada linha empatada receberá a mesma classificação.

    Row_Number(): Definem a saída de um resultado de números, mais especificamente, retorna o número sequencial de uma linha dentro de uma partição de um conjunto de resultados, começando em 1 para a primeira linha em cada partição. ROW_NUMBER e RANK são semelhantes.

    - Em ROW_NUMBER todos os números em sequência linhas (por exemplo 1, 2, 3, 4, 5); e
    - RANK fornece o mesmo valor numérico para as faixas (por exemplo 1, 2, 2, 4, 5), já a
    ROW_NUMBER é um valor temporário calculado quando a consulta é executada.

    Em relação ao Over() é mais conhecida como uma cláusula que você pode utilizar para as funções de agregação, ranking e analísticas, servindo com um element capaz de determinar o particionamento dos dados, bem como, as formas de ordenação aplicada a coluna.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Sup3r-Us3r quinta-feira, 29 de agosto de 2019 01:55
    quinta-feira, 29 de agosto de 2019 01:17
    Moderador
  • Obrigado Junior, esclareceu minha dúvida agora, obrigado pela atenção, explicação e pelo seu tempo!
    quinta-feira, 29 de agosto de 2019 02:11
  • José, eu testei o código e funcionou certinho, testei em 2K de dados, com as explicações suas e dos demais que contribuirão na solução desse problema, consegui obter o que precisava, agradeço a sua atenção e a dos demais, muito obrigado! tenha uma excelente noite!
    quinta-feira, 29 de agosto de 2019 02:21
  • Obrigado Junior, esclareceu minha dúvida agora, obrigado pela atenção, explicação e pelo seu tempo!

    Sup3r-Us3r,

    Disponha, estamos sempre por aqui.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 29 de agosto de 2019 17:38
    Moderador
  • José cometi um equívoco, esqueci de uma parte bem importante no filtro, que sem ela não irá funcionar, vou tentar ser mais objetivo e refazer a pergunta.

    Preciso obter o resultado que está na cor verde:

    Preciso que siga as regras:

    • motivo_envio: Tem que ser TROCA%
    • status: Tem que ser ANOMALIA
    • imei: Tem que ser único

    Critério:

    • data_importacao: Tem que ser a maior (mais recente)

    OBS:

    • Se caso o registro mais atual daquele IMEI estiver com o STATUS igual PENDENTE ou LIBERADO não quero pegar esse resultado, somente se o mais atual estiver com ANOMALIA

    Exemplificando:

    1. IMEI 1111111111 aparece 2 vezes, a primeira vez que apareceu estava com STATUS igual ANOMALIA, mas depois ele apareceu com STATUS igual PENDENTE, ou seja não quero mais, porque esse IMEI o status mais recente dele foi PENDENTE e não ANOMALIA.
    2. IMEI 2222222222 é a mesma coisa do IMEI 1111111111, aparece 2 vezes, a primeira com STATUS igual ANOMALIA mas depois aparece com o STATUS mais recente de PENDENTE, então não preciso dele também.
    3. IMEI 3333333333 e 4444444444 também não preciso, pois o STATUS mais atual é PENDENTE, só precisaria se o STATUS dele fosse ANOMALIA.
    4. IMEI 5555555555 aparece pela primeira vez com STATUS igual ANOMALIA e depois aparece pela segunda vez com o STATUS de ANOMALIA, então preciso dele (o que for o mais recente).

    Criei um arquivo com o CREATE e INSERT desses registros para poder facilitar:

    https://pastebin.com/raw/44f2cECt

    Peço desculpas pelo erro, esqueci de mencionar essa parte importante e crucial para esse filtro, desde já agradeço a ajuda!




    • Editado Sup3r-Us3r sexta-feira, 30 de agosto de 2019 22:49
    quinta-feira, 29 de agosto de 2019 23:59
  • Experimente acrescentar o filtro para a coluna Status no final da query:

    with CTE_RN as
    (
        select
            *,
            row_number() over(partition by imei order by data_alteracao desc) as RN
        from Tabela
        where 
            motivo_envio like 'TROCA%'
    )
    
    select * from CTE_RN 
    where RN = 1 and Status = 'ANOMALIA'

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 30 de agosto de 2019 02:57
  • Já realizei esse teste, mas com isso irá pegar todas as ANOMALIA, no caso precisaria verificar se o STATUS mais atual está como PENDENTE, se estiver não pode pegar.

    • Se caso o registro mais atual daquele IMEI estiver com o STATUS igual PENDENTE ou LIBERADO não quero pegar esse resultado, somente se o mais atual estiver com ANOMALIA
    sexta-feira, 30 de agosto de 2019 03:08
  • Na amostra de dados que você postou, as linhas que estão com o status 'Pendente' estão sem a data de alteração, por isso o status mais recente de todos os IMEIs é 'ANOMALIA'.

    A query que sugeri primeiro classifica as linhas por IMEI considerando a data de alteração (na CTE_RN) para depois verificar se a última linha (RN = 1) está com o status 'ANOMALIA'.


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 30 de agosto de 2019 12:47
  • IMEI 1111111111 aparece 2 vezes, a primeira vez que apareceu estava com STATUS igual ANOMALIA, mas depois ele apareceu com STATUS igual PENDENTE, ou seja não quero mais, porque esse IMEI o status mais recente dele foi PENDENTE e não ANOMALIA.

    Qual foi o critério utilizado para decidir que status PENDENTE foi depois de status ANOMALIA? Não há informação na coluna data_alteracao para a linha que possui status PENDENTE, o que não permite saber se ela é mais recente.

    A mesma dúvida para os IMEI 2222222222, 3333333333 e 4444444444, pois não há informação na coluna data_alteracao para decidir qual é mais recente.

    Preciso que siga as regras:
    • status: Tem que ser ANOMALIA

    OBS:

    • Se caso o registro mais atual daquele IMEI estiver com o STATUS igual PENDENTE ou LIBERADO não quero pegar esse resultado, somente se o mais atual estiver com ANOMALIA

    Aqui me parece que há uma contradição: somente as linhas com status ANOMALIA devem ser lidas para análise (conforme primeira regra) ou somente considerar casos em que a linha mais atual esteja ANOMALIA (conforme OBS)? Há uma grande diferença entre as opções.


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz sexta-feira, 30 de agosto de 2019 14:50
    sexta-feira, 30 de agosto de 2019 14:11
  • Informei coluna errada, a correta seria: data_importacao

    O critério que define o status atual daquele IMEI é a data_importacao mesmo, e referente a regra preciso pegar somente se a linha mais atual estiver com ANOMALIA.

    Desculpe pelos erros na informação. Em resumo se o status atual daquele IMEI for PENDENTE ou LIBERADO não preciso desse resultado, somente se for ANOMALIA o mais atual.

    sexta-feira, 30 de agosto de 2019 14:30
  • O critério que define o status atual daquele IMEI é a data_importacao mesmo, e referente a regra preciso pegar somente se a linha mais atual estiver com ANOMALIA.

    Experimente:

    -- código #1 v2
    with agTEMP as (
    SELECT *,
           seq= row_number() over (partition by gsm, cpf, contrato, imei 
                                   order by data_importacao desc)
      from tbTEMP
      where motivo_envio like 'TROCA%'
    )
    SELECT gsm, cpf, contrato, motivo_envio, data_ativacao, data_importacao, data_alteracao, status, imei
      from agTEMP
      where seq = 1
            and status = 'ANOMALIA';
     


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Marcado como Resposta Sup3r-Us3r sexta-feira, 30 de agosto de 2019 15:33
    • Editado José Diz sexta-feira, 30 de agosto de 2019 16:55
    sexta-feira, 30 de agosto de 2019 14:45
  • Nesse caso experimente trocar a coluna data_alteracao pela coluna data_importacao depois do Order By.

    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 30 de agosto de 2019 14:46