none
UPDATE [estado] com COUNT RRS feed

  • Pergunta

  • Bom dia,

    Tenho a seguinte tabela:

    numero   /    total    / estado

    1300028491 / 14 /   V
    1300028495 / 8  /   V

    O que pretendo, é actualizar o campo "estado" para "N", quando o valor no campo "numero" ocorrer mais do que 4 vezes, ou seja, os primeiros 4 registo ficam com o estado "V", e os restantes registos com estado "N". Neste exemplo, o numero "1300028491", ocorre 14 vezes, sendo que os 4 primeiros teria estado "V" e os restantes 10 passariam a estado "N". Obrigado.




    quinta-feira, 3 de outubro de 2019 08:49

Respostas

  • O que pretendo, é actualizar o campo "estado" para "N", quando o valor no campo "numero" ocorrer mais do que 4 vezes, ou seja, os primeiros 4 registo ficam com o estado "V", e os restantes registos com estado "N". Neste exemplo, o numero "1300028491", ocorre 14 vezes, sendo que os 4 primeiros teria estado "V" e os restantes 10 passariam a estado "N". Obrigado.

    E como se sabe qual é a ordem em que as linhas aparecem, de modo a determinar quais são os quatro primeiros e quais são os restantes para cada valor na coluna "numero"?

    Se um número ocorrer menos de 4 vezes, qual é a ação a realizar?

    Qual é a versão do SQL Server?
         PRINT @@version

    ---

    Eis esboço do código:

    -- código #1 v3
    with Tabela_seq as (
    SELECT *,
           seq= row_number() over (partition by Numero order by ___ asc),
    qtd= count(*) over (partition by Numero) from tabela ) UPDATE Tabela_seq set estado= case when seq <= 4 then 'V' else 'N' end
    where qtd > 4;
    No código SQL acima, onde está ___ substitua pelo nome da coluna que define a sequência em que as linhas devem ser lidas.

     


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


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

    • Sugerido como Resposta José Diz quinta-feira, 3 de outubro de 2019 14:10
    • Marcado como Resposta IgorFKModerator quinta-feira, 10 de outubro de 2019 14:17
    • Editado José Diz quinta-feira, 10 de outubro de 2019 15:25
    quinta-feira, 3 de outubro de 2019 09:16
  • Desde já obrigado pela resposta.

    A tabela em causa tem milhares de registos. Por defeito os estado estão com "A". quando ocorrer menos que 4 vezes, o estado continua a "A". Se o COUNT for superior a 4, é que os restantes ocorrências passam a estado "N". O que mostrei foi um exemplo já com o COUNT(4). A entrada dos registos é feito por data de registo.

    Versão: Microsoft SQL Server 2014 - 12.0.4100.1 (X64)

    Obrigado. Vou testar.


    quinta-feira, 3 de outubro de 2019 09:26

Todas as Respostas

  • O que pretendo, é actualizar o campo "estado" para "N", quando o valor no campo "numero" ocorrer mais do que 4 vezes, ou seja, os primeiros 4 registo ficam com o estado "V", e os restantes registos com estado "N". Neste exemplo, o numero "1300028491", ocorre 14 vezes, sendo que os 4 primeiros teria estado "V" e os restantes 10 passariam a estado "N". Obrigado.

    E como se sabe qual é a ordem em que as linhas aparecem, de modo a determinar quais são os quatro primeiros e quais são os restantes para cada valor na coluna "numero"?

    Se um número ocorrer menos de 4 vezes, qual é a ação a realizar?

    Qual é a versão do SQL Server?
         PRINT @@version

    ---

    Eis esboço do código:

    -- código #1 v3
    with Tabela_seq as (
    SELECT *,
           seq= row_number() over (partition by Numero order by ___ asc),
    qtd= count(*) over (partition by Numero) from tabela ) UPDATE Tabela_seq set estado= case when seq <= 4 then 'V' else 'N' end
    where qtd > 4;
    No código SQL acima, onde está ___ substitua pelo nome da coluna que define a sequência em que as linhas devem ser lidas.

     


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


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

    • Sugerido como Resposta José Diz quinta-feira, 3 de outubro de 2019 14:10
    • Marcado como Resposta IgorFKModerator quinta-feira, 10 de outubro de 2019 14:17
    • Editado José Diz quinta-feira, 10 de outubro de 2019 15:25
    quinta-feira, 3 de outubro de 2019 09:16
  • Desde já obrigado pela resposta.

    A tabela em causa tem milhares de registos. Por defeito os estado estão com "A". quando ocorrer menos que 4 vezes, o estado continua a "A". Se o COUNT for superior a 4, é que os restantes ocorrências passam a estado "N". O que mostrei foi um exemplo já com o COUNT(4). A entrada dos registos é feito por data de registo.

    Versão: Microsoft SQL Server 2014 - 12.0.4100.1 (X64)

    Obrigado. Vou testar.


    quinta-feira, 3 de outubro de 2019 09:26
  • Funcionou.

    Muito obrigado. Abraço

    quinta-feira, 3 de outubro de 2019 09:38
  • Funcionou.

    Muito obrigado. Abraço

    Ok.

    Ao reler há pouco o enunciado deste tópico, alterei a cláusula WHERE de
          where qtd >= 4;
    para
          where qtd > 4;


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


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

    • Editado José Diz quinta-feira, 10 de outubro de 2019 15:27
    quinta-feira, 10 de outubro de 2019 15:27