es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Buscar filas donde el applicant_id es nulo en MSSQL.

Necesito encontrar el ID de solicitante nulo por ID de usuario web después de la fecha mínima en la que se llenó el ID de solicitante.

Por ejemplo, para el ID de usuario web 23 encontraremos el ID de solicitante nulo después de la fila ID = 3, porque es el primer ID de solicitante que se llenó con la fecha mínima.

Para el ID de usuario web 90 encontraremos el ID de solicitante nulo después de la fila ID = 11, porque es el primer ID de solicitante que se llenó con la fecha mínima.

https://prnt.sc/264ofhg

La tabla es:

row_id applicant_id web_user_id date
1 null 23 2020
2 null 23 2021
3 77 23 2022
4 77 23 2023
5 77 23 2024
6 null 23 2025
7 77 23 2026
8 null 23 2027
9 77 23 2028
10 null 90 2020
11 55 90 2021
12 55 90 2022
13 55 90 2023
14 55 90 2024
15 null 90 2025
16 55 90 2026
17 55 90 2027

La condición es:
seleccionar min(date), applicant_id, row_id, web_user_id
y después de esta fecha, necesito encontrar filas donde el ID de solicitante sea nulo.

Como resultado, me gustaría tener esta tabla:
https://prnt.sc/264om6u

row_id applicant_id web_user_id date
6 null 23 2025
8 null 23 2027
15 null 90 2025

SQL para crear la tabla

create table dbo.tabl (
row_id int,
applicant_id int,
web_user_id int,
“date” int
);

insert into dbo.tabl values
(1, null, 23, 2020),
(2, null, 23, 2021),
(3, 77, 23, 2022),
(4, 77, 23, 2023),
(5, 77, 23, 2024),
(6, null, 23, 2025),
(7, 77, 23, 2026),
(8, null, 23, 2027),
(9, 77, 23, 2028),
(10, null, 90, 2020),
(11, 55, 90, 2021),
(12, 55, 90, 2022),
(13, 55, 90, 2023),
(14, 55, 90, 2024),
(15, null, 90, 2025),
(16, 55, 90, 2026),
(17, 55, 90, 2027);

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener el resultado deseado, debemos realizar los siguientes pasos:

    1. Encontrar la primera aparición de “applicant_id” para cada “web_user_id”, utilizando la función “min()” en la columna “date”.
    2. Utilizar la función “row_number()” para asignar un número de fila a cada fila dentro de cada grupo de “web_user_id”, ordenado por “date”.
    3. Unir la tabla consigo misma en base a “web_user_id” y solo incluir filas donde el “row_number” sea mayor que el número de fila de la primera aparición de “applicant_id”.
    4. Filtrar la tabla unida para incluir solo filas donde “applicant_id” sea nulo.

    Aquí tienes el código SQL para lograr esto:

    WITH first_appl AS (
      SELECT web_user_id, MIN(date) AS first_date, MIN(row_id) AS first_row
      FROM dbo.tabl
      WHERE applicant_id IS NOT NULL
      GROUP BY web_user_id
    ), row_numbers AS (
      SELECT row_id, applicant_id, web_user_id, date,
             ROW_NUMBER() OVER (PARTITION BY web_user_id ORDER BY date) AS row_num
      FROM dbo.tabl
    ), joined AS (
      SELECT r.row_id, r.applicant_id, r.web_user_id, r.date
      FROM row_numbers r
      JOIN first_appl f ON r.web_user_id = f.web_user_id
      WHERE r.row_num > (SELECT row_num FROM row_numbers WHERE row_id = f.first_row)
    ), null_appl AS (
      SELECT *
      FROM joined
      WHERE applicant_id IS NULL
    )
    SELECT *
    FROM null_appl;
    

    Esto nos dará el resultado deseado:

    | row_id | applicant_id | web_user_id | date |
    | ------ | ------------ | ----------- | ---- |
    | 6      | NULL         | 23          | 2025 |
    | 8      | NULL         | 23          | 2027 |
    | 15     | NULL         | 90          | 2025 |
    

Comments are closed.