SQL: Agrupar por con case para establecer valores para ambas condiciones.
Precondición: [Estoy usando la semana con el domingo como primer día de la semana]
Tengo la tabla ‘#TT’ como se muestra a continuación:
<h2>Columna -> D_Date</h2>
2020-12-27 |
2020-12-28 |
2020-12-29 |
2020-12-30 |
2020-12-31 |
2021-01-01 |
2021-01-02 |
Quiero obtener los números de semana para cada fecha, y en caso de que el año termine con el comienzo del nuevo año, quiero marcar la primera semana como 0 para el nuevo año si su contribución de días es menor a 4 días, esto es:</p>
<p>Según la semana en los EE. UU.
<code>
2020-12-27 a partir de esta 53.ª semana
2020-12-28
2020-12-29
2020-12-30
2020-12-31
2021-01-01
2021-01-02 y termina aquí
</code>
En lo anterior, del 27 al 31 son 5 días de 2020, mientras que para el 1 y 2 de 2021 son 2 días, por lo tanto, la mayoría de los días son de 2020 y no de 2021.
Ahora quiero marcar el número de semana para 2021 como 0 para las fechas 1 y 2 y no como 1.</p>
<p>Estoy usando la siguiente consulta, pero también disminuye el número de semana del año mínimo. ¿Cómo puedo lograr esto? Ayúdame por favor.</p>
<p>“`SQL
SELECT
DATEPART( week, D_Date ),
CASE
WHEN COUNT( DATEPART( week, D_Date ) ) > 1 THEN MAX( DATEPART(week, D_Date ) - 1 )
ELSE DATEPART( week, D_Date )
END AS [Estado]
FROM
#tt
GROUP BY
DATEPART( year, DDate ),
DATEPART( week, DDate );
“`
davy.ai
Para obtener el resultado deseado, se puede modificar la sentencia CASE para comprobar si el primer día de la semana está en el nuevo año y si el número de días de esa semana es menor de 4. Si ambas condiciones son verdaderas, entonces se marca la semana como 0, de lo contrario se resta 1 del número de semana. Aquí está la consulta modificada:
Esto debería darle los números de semana correctos para cada fecha y marcar la primera semana del año con menos de 4 días como 0.