Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

79
Vistas
Cree una columna de estado con 3 categorías basadas en condiciones en varias columnas en SQL

yo tengo una mesa asi

 CREATE TABLE proc_code ( id INTEGER, c_date DATE, code VARCHAR(255) ); INSERT INTO proc_code (id, c_date, code) VALUES (101, '2017-12-21', '3027f'), (101, '2017-12-24', '3027f'), (102, '2017-10-09', '3027f'), (102, '2017-10-16', '3025f'), (102, '2017-10-23', '3027f'), (103, '2017-09-21', '3025f'), (104, '2017-07-23', '3027f'), (104, '2017-07-28', '3027f'), (104, '2017-07-31', '3025f'), (105, '2017-03-06', '3025f'), (105, '2017-03-16', '3027f'), (105, '2017-03-22', '3027f');

Estoy tratando de crear una nueva columna llamada " Status " según las siguientes condiciones

Mirando el máximo y el mínimo de la columna de date ,

  • Status = "Sin cambios", si el valor en la columna de code es el mismo para max( date ) y min( date )
  • Status = "Aumentado", si el valor en la columna de code es ' 3025f ' para min( date ) y '3027f' para máx( date )
  • Status = "Disminuido", si el valor en la columna de code es ' 3027f ' para min( date ) y '3025f' para máx( date )

Mi resultado deseado es

 id c_date code status 101 2017-12-21 3027f Constant 101 2017-12-24 3027f Constant 102 2017-10-09 3027f Constant 102 2017-10-16 3025f Constant 102 2017-10-23 3027f Constant 103 2017-09-21 3025f Constant 104 2017-07-23 3027f Decreased 104 2017-07-28 3027f Decreased 104 2017-07-31 3025f Decreased 105 2017-03-06 3025f Increased 105 2017-03-16 3027f Increased 105 2017-03-22 3027f Increased

Estoy tratando de hacerlo de esta manera, pero no lo hago bien.

 select id, c_date, code, CASE WHEN ((max(c_date) > min(c_date) && (code == '3025f'))) THEN "Constant" ELSE "Increased" END AS Status FROM proc_code GROUP BY id, c_date, code

¿Hay alguna forma eficiente de obtener el resultado deseado? ¿Alguien me puede apuntar en la dirección correcta?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Usa first_value() . Usaré una subconsulta para que la lógica sea más fácil de seguir:

 select pc.*, (case when first_code = last_code then 'no change' when first_code = '3025f' and last_code = '3027f' then 'increasing' when first_code = '3027f' and last_code = '3025f' then 'decreasing' else 'something else' end) as status from (select pc.*, first_value(code) over (partition by id order by c_date) as first_code, first_value(code) over (partition by id order by c_date desc) as last_code, from proc_code pc ) pc
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda