Selección de filas que tienen row_number más de 1

Tengo una tabla como sigue (utilizando bigquery):

idañomesventasrow_number
11120201110001
11120201220002
11220201130001
11320201110001

¿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:

idañomesventasrow_number
11120201110001
11120201220002

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

    enter image description here

    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 SQL

    Respondida 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 con row_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 donde row_number es mayor a 1, y también aquellas filas cuyo

    Respondida 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 principal SELECT </strong> FROM table_name WHERE row_number IN (subconsulta) selecciona todas las filas de la tabla table_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