Problema:
Quiere agrupar sus datos por año.
Ejemplo I:
Una de las columnas en sus datos es transaction_date
. Contiene una fecha. Le gustaría agrupar todos sus datos por año y calcular el dinero total ganado cada año.
Los data
la tabla se ve así:
fecha_transacción | dinero |
---|---|
2018-03-25 | 1700 |
2019-09-12 | 100 |
2018-07-14 | 1200 |
2018-01-05 | 400 |
2019-06-08 | 2000 |
2020-03-06 | 1500 |
Solución 1 (mostrar el año y el dinero ganado):
SELECT EXTRACT(year FROM transaction_date) AS year, SUM(money) AS money_earned FROM data GROUP BY EXTRACT(year FROM transaction_date);
El resultado es:
año | dinero_ganado |
---|---|
2020 | 1500 |
2019 | 2100 |
2018 | 3300 |
Solución 2 (mostrando la fecha completa, el año y el dinero ganado en el año correspondiente):
SELECT transaction_date AS transaction_date, EXTRACT(year FROM transaction_date) AS year, SUM(money) OVER(PARTITION BY EXTRACT(year FROM transaction_date)) AS money_earned FROM data;
El resultado es:
fecha_transacción | año | dinero_ganado |
---|---|---|
2018-03-25 | 2018 | 3300 |
2018-07-14 | 2018 | 3300 |
2018-01-05 | 2018 | 3300 |
2019-09-12 | 2019 | 2100 |
2019-06-08 | 2019 | 2100 |
2020-03-06 | 2020 | 1500 |
Discusión:
En este ejemplo, se supone que no tiene el year
columna. En su lugar, tiene la columna con fechas completas.
Primero, necesita recuperar un año a partir de la fecha. Puedes usar el EXTRACT(part FROM date)
función para hacerlo. En su caso, le gustaría extraer el año, por lo que la part
es year
. La date
es la columna que contiene las fechas:transaction_date
columna. Es una buena idea cambiar el nombre de la columna al año posterior. Si desea obtener más información sobre el EXTRACT
función y cómo recuperar diferentes partes de la fecha, puede encontrarlo aquí.
Si desea mostrar solo el año y el dinero total ganado en este año, puede usar un GROUP BY
. La primera columna seleccionada es el año extraído de la fecha. La segunda columna es la función agregada SUM(money)
. Al final de la consulta, necesita un GROUP BY EXTRACT(year FROM transaction_date)
o, más simple, GROUP BY 1 (since EXTRACT(year FROM transaction_date)
es la primera columna.)
Si desea mostrar más columnas, necesita una función de ventana (Solución 2). Después de SUM(money)
escribes el OVER()
cláusula y, dado que le gustaría calcular la suma de cada año, utilice PARTITION BY EXTRACT(year FROM transaction_date)
dentro de eso. Tenga en cuenta que aún no tiene la columna del año al calcular la suma, por lo que PARTITION BY year
no funcionará:obtendrá un error 'column "year" does not exist'
. Puede leer más sobre las funciones de la ventana en este artículo.
Ejemplo II:
Una de las columnas en sus datos es year
. Le gustaría agrupar todos sus datos por esta columna y calcular el dinero total ganado cada año.
Los data
la tabla se ve así:
año | mes | día | dinero |
---|---|---|---|
2018 | 3 | 25 | 1700 |
2019 | 9 | 12 | 100 |
2018 | 7 | 14 | 1200 |
2018 | 1 | 5 | 400 |
2019 | 6 | 8 | 2000 |
2020 | 3 | 6 | 1500 |
Solución 1 (mostrar el año y el dinero ganado):
SELECT year, SUM(money) AS money_earned FROM data GROUP BY year;
El resultado es:
año | dinero_ganado |
---|---|
2020 | 1500 |
2018 | 3300 |
2019 | 2100 |
Solución 2 (mostrar año, mes, día y el dinero ganado en el año correspondiente):
SELECT year, month, day, SUM(money) OVER(PARTITION BY year) AS money_earned FROM data;
El resultado es:
año | mes | día | dinero_ganado |
---|---|---|---|
2018 | 3 | 25 | 3300 |
2018 | 7 | 14 | 3300 |
2018 | 1 | 5 | 3300 |
2019 | 9 | 12 | 2100 |
2019 | 6 | 8 | 2100 |
2020 | 3 | 6 | 1500 |
Discusión:
En este ejemplo, se supone que ya tiene el year
columna.
Si desea mostrar el año y el dinero total ganado en este año, un simple GROUP BY
es suficiente. Si no se siente cómodo con el concepto de GROUP BY
, echa un vistazo aquí donde te lo explicamos. Simplemente usa la función de agregado (aquí:SUM
) con la columna correcta y al final de la consulta se agrupa por year
. Puede cambiar el nombre de la columna usando el AS
palabra clave con un nuevo nombre.
Es más complicado si también desea mostrar algunas otras columnas. Entonces necesita la solución usando una función de ventana (Solución 2). Debe utilizar la función de agregado con la columna correspondiente (aquí:SUM(money)
) y escribe OVER()
cláusula posterior. En esta cláusula, debe usar PARTITION BY
con la columna por la que desea agrupar. Así es como obtienes:
SUM(money) OVER(PARTITION BY year)
En esta solución, no usa un GROUP BY
cláusula.
Puede leer más sobre las funciones de la ventana aquí.