Selección de filas que tienen row_number más de 1
Tengo una tabla como sigue (utilizando bigquery):
id | año | mes | ventas | row_number |
---|---|---|---|---|
111 | 2020 | 11 | 1000 | 1 |
111 | 2020 | 12 | 2000 | 2 |
112 | 2020 | 11 | 3000 | 1 |
113 | 2020 | 11 | 1000 | 1 |
¿Hay una manera en la que puedo seleccionar filas que tienen números de fila más de uno?
Por ejemplo, mi salida deseada es:
id | año | mes | ventas | row_number |
---|---|---|---|---|
111 | 2020 | 11 | 1000 | 1 |
111 | 2020 | 12 | 2000 | 2 |
No quiero seleccionar exclusivamente filas con fila_número = 2 pero también fila_número = 1 también.
El bloque de código original que usé para el primer resultado de la tabla es:
SELECT
id,
year,
month,
SUM(sales) AS sales,
ROW_NUMBER() OVER (PARTITIONY BY id ORDER BY id ASC) AS row_number
FROM
table
GROUP BY
id, year, month
Pregunta hecha hace 3 años, 5 meses, 0 días - Por bitwisewizard
6 Respuestas:
-
Puede utilizar funciones de ventana:
select t.* except (cnt) from (select t.*, count(*) over (partition by id) as cnt from t ) t where cnt > 1;
Como se aplica a su consulta de agregación:
SELECT iym.* EXCEPT (cnt) FROM (SELECT id, year, month, SUM(sales) as sales, ROW_NUMBER() OVER (Partition by id ORDER BY id ASC) AS row_number COUNT(*) OVER(Partition by id ORDER BY id ASC) AS cnt FROM table GROUP BY id, year, month ) iym WHERE cnt > 1;
Respondida el Dec 17, 2020 a las 02:28 - por phpphoenix
Votos positivos: 0 | Votos negativos: 0 -
Puede envolver su consulta como en el ejemplo siguiente
select * except(flag) from ( select *, countif(row_number > 1) over(partition by id) > 0 flag from (YOUR_ORIGINAL_QUERY) ) where flag
así puede parecer
select * except(flag) from ( select *, countif(row_number > 1) over(partition by id) > 0 flag from ( SELECT id, year, month, SUM(sales) as sales, ROW_NUMBER() OVER(Partition by id ORDER BY id ASC) AS row_number FROM table GROUP BY id, year, month ) ) where flag
así que cuando se aplica a los datos de muestra en su pregunta - producirá abajo la salida
Respondida el Dec 17, 2020 a las 02:35 - por syntaxsculptor
Votos positivos: 0 | Votos negativos: 0 -
Prueba esto:
with tmp as (SELECT id, year, month, SUM(sales) as sales, ROW_NUMBER() OVER(Partition by id ORDER BY id ASC) AS row_number FROM table GROUP BY id, year, month) select * from tmp a where exists ( select 1 from tmp b where a.id = b.id and b.row_number =2)
Es tan claramente
exists statement
SQLRespondida el Dec 17, 2020 a las 02:41 - por bitcraftsman
Votos positivos: 0 | Votos negativos: 0 -
Esto es lo que uso, es similar a @ElapsedSoul respuesta pero desde mi entendimiento para la lista estática "IN" es mejor que usar "EXISTS" pero no estoy seguro si la diferencia de rendimiento, si la hay, es significativa:
¿Diferencia entre EXISTS e IN en SQL?
WITH T1 AS ( SELECT id, year, month, SUM(sales) as sales, ROW_NUMBER() OVER(PARTITION BY id ORDER BY id ASC) AS ROW_NUM FROM table GROUP BY id, year, month ) SELECT * FROM T1 WHERE id IN (SELECT id FROM T1 WHERE ROW_NUM > 1);
Respondida el Dec 17, 2020 a las 02:50 - por binarybard
Votos positivos: 0 | Votos negativos: 0 -
Para seleccionar las filas que tienen un
row_number
mayor a 1, pero también incluir aquellas conrow_number
igual a 1, puedes utilizar una subconsulta o un CTE (Common Table Expression) en tu consulta. Aquí te muestro un ejemplo de cómo podrías modificar tu consulta original para lograr el resultado deseado:sql WITH cte AS ( SELECT id, year, month, SUM(sales) AS sales, ROW_NUMBER() OVER (PARTITION BY id ORDER BY id ASC) AS row_number FROM table GROUP BY id, year, month ) SELECT id, year, month, sales, row_number FROM cte WHERE row_number > 1 OR id NOT IN (SELECT id FROM cte WHERE row_number = 1)
En esta consulta, se crea un CTE
cte
que contiene la misma lógica que tu consulta original. Luego, se seleccionan todas las filas donderow_number
es mayor a 1, y también aquellas filas cuyoRespondida el Dec 18, 2020 a las 02:28 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Claro, aquí hay una forma de seleccionar filas que tienen un número de fila mayor que 1 utilizando una subconsulta:
SELECT FROM table_name WHERE row_number IN ( SELECT row_number FROM table_name GROUP BY id HAVING COUNT() > 1 )
Esta consulta utiliza una subconsulta para seleccionar los números de fila de las filas que tienen recuentos duplicados. Luego, la consulta principal utiliza
IN
para seleccionar filas que tienen esos números de fila.Aquí hay un desglose de cómo funciona la consulta:
La subconsulta
SELECT row_number FROM table_name GROUP BY id HAVING COUNT(</strong>) > 1
selecciona los números de fila de las filas que tienen recuentos duplicados. La consulta principalSELECT </strong> FROM table_name WHERE row_number IN (subconsulta)
selecciona todas las filas de la tablatable_name
cuyo número de fila está en la lista devuelta por la subconsulta.Ten en cuenta que esta consulta seleccionará todas las filas que tienen números de fila duplicados, independientemente del valor de esos números de fila. Si solo deseas seleccionar filas con números de fila mayores que 1, puedes modificar la subconsulta de la siguiente manera:
SELECT row_number FROM table_name GROUP BY id HAVING COUNT(*) > 1 AND MIN(row_number) > 1
Respondida el Dec 18, 2020 a las 02:30 - por Gemini
Votos positivos: 0 | Votos negativos: 0