none
Como filtrar por criterio de variación entre fechas en SQL Server RRS feed

  • Pregunta

  • Espero que alguien me pueda ayudar con el siguiente problema de la vida real =)

    Tengo una BBDD "BD_EJEMPLO" y tabla "Ejemplo_Encuestas" en SQL Server que corresponden a encuestas a clientes y tiene los campos:

    • Id_Encuesta
    • Id_Cliente
    • Fecha_Encuesta
    • Calificacion
    • Calificacion_Agrupada

    Donde:

    • Id_Encuesta: Corresponde a un ID único de cada fila.
    • Id_Cliente: Es el identificador de cada cliente encuestado y puede repetirse. Fecha_Encuesta: Fecha en que se efectuó la encuesta.
    • Calificacion: Puntaje relacionado a la encuesta que varía de 0 a 10 donde 0 es malo y 10 es bueno.
    • Calificacion_Agrupada: Agrupamiento del campo anterior "Calificacion" para tener solo 3 criterios donde "A" es bueno y corresponde a los puntajes 9 y 10, "B" es regular y corresponde a los puntajes 7 y 8 y "C" malo y corresponde a los puntajes desde el 0 hasta el 6.

    Lo que se quiere marcar "SI"/"NO" en un campo adicional "Variacion_Negativa" aquellos "Id_Cliente" que en el tiempo disminuyeron en su Calificación"/"Calificacion_Agrupada". Por decir algunos ejemplos:

    • Si un cliente tiene tiene 02 encuestas con calificaciones de mas reciente a mas antiguo {"C";"A"} entonces en la nueva columna debería marcarse como un "SI" ya que disminuyó de "A" a "C".

    • Otro cliente {"B";"B";"B";"A"} tiene 04 encuestas, tiene calificación "B" desde hace un tiempo, pero en algún momento fué "A", entonces también debe marcarse como "SI".

    • Otro cliente {"A";"A";"A"} siempre tuvo la misma calificación entonces debe marcarse como un "NO".

    • Otro cliente {"A";"B";"C"} Actualmente es "A" y antes era "B" varió hacia mejor, debe marcarse como un "NO" ya que solo buscamos aquellos que varían hacia menos.

    • Otro {"C"} tiene una sola encuesta, entonces es "NO" ya que no hay variación.

    En resumen: Lo que se busca es marcar en la nueva columna con "SI", SOLO aquellas variaciones a menos comparando la encuesta mas reciente contra la anterior o si la anterior es igual con la variación mas reciente, teniendo en cuenta que el cliente ha tenido mas de una encuesta.

    O de lo contrario obtener una nueva tabla con solo aquellos clientes "Id_Cliente" que cumplan con el criterio requerido.

    Gracias de antemano a quien pueda ayudarme :)

    Un Ejemplo sería:

    USE [master]
    GO /****** Object: Database [BD_EJEMPLO] Script Date: 10/23/2018 17:09:22 ******/
    CREATE DATABASE [BD_EJEMPLO] ON PRIMARY (NAME = N'BD_EJEMPLO', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\BD_EJEMPLO.mdf', SIZE = 3072 KB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024 KB) LOG ON (NAME = N'BD_EJEMPLO_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\BD_EJEMPLO_log.ldf', SIZE = 1024 KB, MAXSIZE = 2048 GB, FILEGROWTH = 10 %)
    GO
    ALTER DATABASE [BD_EJEMPLO] SET COMPATIBILITY_LEVEL = 100
    GO
    IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
    BEGIN
      EXEC [BD_EJEMPLO].[dbo].[sp_fulltext_database] @action = 'enable'
    END
    GO
    ALTER DATABASE [BD_EJEMPLO] SET ANSI_NULL_DEFAULT OFF
    GO
    ALTER DATABASE [BD_EJEMPLO] SET ANSI_NULLS OFF
    GO
    ALTER DATABASE [BD_EJEMPLO] SET ANSI_PADDING OFF
    GO
    ALTER DATABASE [BD_EJEMPLO] SET ANSI_WARNINGS OFF
    GO
    ALTER DATABASE [BD_EJEMPLO] SET ARITHABORT OFF
    GO
    ALTER DATABASE [BD_EJEMPLO] SET AUTO_CLOSE OFF
    GO
    ALTER DATABASE [BD_EJEMPLO] SET AUTO_CREATE_STATISTICS ON
    GO
    ALTER DATABASE [BD_EJEMPLO] SET AUTO_SHRINK OFF
    GO
    ALTER DATABASE [BD_EJEMPLO] SET AUTO_UPDATE_STATISTICS ON
    GO
    ALTER DATABASE [BD_EJEMPLO] SET CURSOR_CLOSE_ON_COMMIT OFF
    GO
    ALTER DATABASE [BD_EJEMPLO] SET CURSOR_DEFAULT GLOBAL
    GO
    ALTER DATABASE [BD_EJEMPLO] SET CONCAT_NULL_YIELDS_NULL OFF
    GO
    ALTER DATABASE [BD_EJEMPLO] SET NUMERIC_ROUNDABORT OFF
    GO
    ALTER DATABASE [BD_EJEMPLO] SET QUOTED_IDENTIFIER OFF
    GO
    ALTER DATABASE [BD_EJEMPLO] SET RECURSIVE_TRIGGERS OFF
    GO
    ALTER DATABASE [BD_EJEMPLO] SET DISABLE_BROKER
    GO
    ALTER DATABASE [BD_EJEMPLO] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
    GO
    ALTER DATABASE [BD_EJEMPLO] SET DATE_CORRELATION_OPTIMIZATION OFF
    GO
    ALTER DATABASE [BD_EJEMPLO] SET TRUSTWORTHY OFF
    GO
    ALTER DATABASE [BD_EJEMPLO] SET ALLOW_SNAPSHOT_ISOLATION OFF
    GO
    ALTER DATABASE [BD_EJEMPLO] SET PARAMETERIZATION SIMPLE
    GO
    ALTER DATABASE [BD_EJEMPLO] SET READ_COMMITTED_SNAPSHOT OFF
    GO
    ALTER DATABASE [BD_EJEMPLO] SET HONOR_BROKER_PRIORITY OFF
    GO
    ALTER DATABASE [BD_EJEMPLO] SET READ_WRITE
    GO
    ALTER DATABASE [BD_EJEMPLO] SET RECOVERY FULL
    GO
    ALTER DATABASE [BD_EJEMPLO] SET MULTI_USER
    GO
    ALTER DATABASE [BD_EJEMPLO] SET PAGE_VERIFY CHECKSUM
    GO
    ALTER DATABASE [BD_EJEMPLO] SET DB_CHAINING OFF
    GO
    USE [BD_EJEMPLO]
    GO /****** Object: Table [dbo].[Ejemplo_Encuestas] Script Date: 10/23/2018 17:09:22 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Ejemplo_Encuestas] (
      [Id_Encuesta] nvarchar NULL,
      [Id_Cliente] nvarchar NULL,
      [Fecha_Encuesta] [datetime] NULL,
      [Calificacion] [float] NULL,
      [Calificacion_Agrupada] nchar NULL
    ) ON [PRIMARY]
    GO
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E1183422', N'15152222', CAST(0x0000A72401166F4C AS datetime), 10, N'A ')
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E2761000', N'15887888', CAST(0x0000A85800BD68AC AS datetime), 4, N'C ')
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E6111502', N'10005922', CAST(0x0000A8A800153EAC AS datetime), 0, N'C ')
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E4370063', N'10005922', CAST(0x0000A82000551DD8 AS datetime), 10, N'A ')
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E9213303', N'10014760', CAST(0x0000A97600984B1C AS datetime), 7, N'B ')
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E4968314', N'10014760', CAST(0x0000A851003F5F70 AS datetime), 8, N'B ')
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E3809315', N'10014760', CAST(0x0000A7F001316220 AS datetime), 9, N'A ')
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E2585759', N'10014760', CAST(0x0000A78D00D082E8 AS datetime), 10, N'A ')
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E5003484', N'10036018', CAST(0x0000A856005B00E0 AS datetime), 10, N'A ')
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E3310246', N'10036018', CAST(0x0000A7C800DB2784 AS datetime), 9, N'A ')
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E5160256', N'10050175', CAST(0x0000A863005BE7BC AS datetime), 10, N'A ')
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E970395', N'10050175', CAST(0x0000A714010E4A88 AS datetime), 1, N'C ')
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E8777911', N'10096264', CAST(0x0000A95900AB2994 AS datetime), 9, N'A ')
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E4271133', N'10096264', CAST(0x0000A81800A64BE0 AS datetime), 5, N'C ')
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E3149569', N'10096264', CAST(0x0000A7BA00F92F04 AS datetime), 6, N'C ')
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E4287335', N'10148833', CAST(0x0000A8190034D244 AS datetime), 8, N'B ')
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E2761406', N'10148833', CAST(0x0000A79A00909A5C AS datetime), 9, N'A ')
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E6504352', N'32676535', CAST(0x0000A8C500B623BC AS datetime), 8, N'B ')
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E5028381', N'32676535', CAST(0x0000A85800BD68AC AS datetime), 9, N'A ')
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E3912375', N'32676535', CAST(0x0000A7FA00999A44 AS datetime), 10, N'A ')
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E2398215', N'32676535', CAST(0x0000A78000C927B4 AS datetime), 7, N'B ')
    INSERT [dbo].[Ejemplo_Encuestas] ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E1183763', N'32676535', CAST(0x0000A72401166F4C AS datetime), 8, N'B ')

    miércoles, 24 de octubre de 2018 5:57

Respuestas

  • Por eso es importante postear la version de SQL Server en uso cuando se postea una pregunta como esta.

    La logica sigue siendo la misma, lo que cambiaremos es el metodo de identificar grupos de filas continuas por cliente, clasificacion agregada y fecha de encuesta.

    DECLARE @Ejemplo_Encuestas table (
      [Id_Encuesta] nvarchar(15) NULL,
      [Id_Cliente] nvarchar(15) NULL,
      [Fecha_Encuesta] [datetime] NULL,
      [Calificacion] [float] NULL,
      [Calificacion_Agrupada] nchar(1) NULL
    )
    
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E1183422', N'15152222', CAST(0x0000A72401166F4C AS datetime), 10, N'A ');
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E2761000', N'15887888', CAST(0x0000A85800BD68AC AS datetime), 4, N'C ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E6111502', N'10005922', CAST(0x0000A8A800153EAC AS datetime), 0, N'C ');
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E4370063', N'10005922', CAST(0x0000A82000551DD8 AS datetime), 10, N'A ');
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E9213303', N'10014760', CAST(0x0000A97600984B1C AS datetime), 7, N'B ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E4968314', N'10014760', CAST(0x0000A851003F5F70 AS datetime), 8, N'B ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E3809315', N'10014760', CAST(0x0000A7F001316220 AS datetime), 9, N'A ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E2585759', N'10014760', CAST(0x0000A78D00D082E8 AS datetime), 10, N'A ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E5003484', N'10036018', CAST(0x0000A856005B00E0 AS datetime), 10, N'A ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E3310246', N'10036018', CAST(0x0000A7C800DB2784 AS datetime), 9, N'A ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E5160256', N'10050175', CAST(0x0000A863005BE7BC AS datetime), 10, N'A ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E970395', N'10050175', CAST(0x0000A714010E4A88 AS datetime), 1, N'C ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E8777911', N'10096264', CAST(0x0000A95900AB2994 AS datetime), 9, N'A ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E4271133', N'10096264', CAST(0x0000A81800A64BE0 AS datetime), 5, N'C ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E3149569', N'10096264', CAST(0x0000A7BA00F92F04 AS datetime), 6, N'C ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E4287335', N'10148833', CAST(0x0000A8190034D244 AS datetime), 8, N'B ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E2761406', N'10148833', CAST(0x0000A79A00909A5C AS datetime), 9, N'A ');
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E6504352', N'32676535', CAST(0x0000A8C500B623BC AS datetime), 8, N'B')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E5028381', N'32676535', CAST(0x0000A85800BD68AC AS datetime), 9, N'A')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E3912375', N'32676535', CAST(0x0000A7FA00999A44 AS datetime), 10, N'A ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E2398215', N'32676535', CAST(0x0000A78000C927B4 AS datetime), 7, N'B ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E1183763', N'32676535', CAST(0x0000A72401166F4C AS datetime), 6, N'C ');
    
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
    VALUES
    ('E1111111', '1013977', '2017-12-06 03:43:06.000', 9, 'A'),
    ('E2222222', '1013977', '2017-09-01 12:19:20.000', 9, 'A'),         
    ('E3333333', '1013977', '2017-06-01 10:38:47.000', 8, 'B'),         
    ('E4444444', '1013977', '2017-02-24 16:56:43.000', 9, 'A');
    														
    SELECT * 
    FROM @Ejemplo_Encuestas
    ORDER BY Id_Cliente, Fecha_Encuesta, Id_Encuesta;
    
    WITH R1 AS (
    -- identificar grupos
    SELECT
    	*,
    	ROW_NUMBER() OVER(PARTITION BY Id_Cliente ORDER BY Fecha_Encuesta, Id_Encuesta) -
    	ROW_NUMBER() OVER(PARTITION BY Id_Cliente, Calificacion_Agrupada ORDER BY Fecha_Encuesta, Id_Encuesta) AS grp
    FROM
    	@Ejemplo_Encuestas
    )
    , R2 AS (
    -- agrupar y agregar
    SELECT
    	Id_Cliente,
    	grp,
    	MIN(Calificacion_Agrupada) AS cal_agp,
    	MIN(Fecha_Encuesta) AS min_fe,
    	MAX(Fecha_Encuesta) AS max_fe
    FROM
    	R1
    GROUP BY
    	Id_Cliente,
    	grp
    )
    , R3 AS (
    -- enumerar grupos para cada cliente
    -- mas reciente sera 1
    SELECT
    	*,
    	ROW_NUMBER() OVER(PARTITION BY Id_Cliente ORDER BY min_fe DESC, grp) AS grp_num
    FROM
    	R2
    )
    , R4 AS (
    -- seleccionar los dos mas recientes por cliente SELECT * FROM R3 WHERE grp_num < 3 ) -- unir grupo uno con dos por cada cliente SELECT R4.Id_Cliente, R4.grp_num, R4.min_fe, R4.max_fe, R4.cal_agp, R5.grp_num AS prv_grp_num, R5.min_fe AS prv_min_fe, R5.max_fe AS prv_max_fe, R5.cal_agp AS prv_cal_agp, CASE WHEN R4.cal_agp > ISNULL(R5.cal_agp, R4.cal_agp) THEN 'SI' ELSE 'NO' END AS Variacion_Negativa FROM R4 LEFT OUTER JOIN R4 AS R5 ON R5.Id_Cliente = R4.Id_Cliente AND R5.grp_num = R4.grp_num + 1 WHERE R4.grp_num = 1;


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    • Marcado como respuesta Carlos_JPQ miércoles, 24 de octubre de 2018 22:34
    miércoles, 24 de octubre de 2018 18:10

Todas las respuestas

  • Hola Carlos_JPQ:

    Por lo que expones, yo personalmente, haría una tabla nueva con id_Cliente y variación_Acumulada.

    Cuando insertas una encuesta, vas a buscar sus resultados anteriores, y realizas también la modificación/inserción en la nueva tabla.

    Para tu consulta, puede ser algo de este estilo, si lo he evaluado correctamente:

    ;WITH cte
         AS (
         SELECT ROW_NUMBER() OVER(PARTITION BY id_cliente ORDER BY id_cliente,
                                                                   fecha_encuesta DESC) AS fila,
                *
         FROM [ejemplo_Encuestas]),
         cte2
         AS (
         SELECT c.id_cliente
         FROM cte c
         WHERE c.Calificacion_Agrupada = 'A'
               AND fila > 1
         EXCEPT
         SELECT c.id_cliente
         FROM cte c
         WHERE c.Calificacion_Agrupada = 'A'
               AND fila = 1)
         SELECT d.id_cliente
         FROM cte2 d
         UNION
         SELECT c.id_cliente
         FROM cte c
              LEFT JOIN cte d ON c.Id_Cliente = d.Id_Cliente
                                 AND c.fila = d.fila + 1
         WHERE
    	     d.Calificacion_Agrupada > c.Calificacion_Agrupada;
    
    
    
    
    

    Numero todas las filas en cte, por idCliente, ordenándolas por fecha. En el segundo cte, están todos los clientes, que tengan una encuesta A en cualquier fila, menos en la mas reciente, y a estos, le sumo todos los clientes que hayan empeorado.

    La salida, con tu data es:

    Si es correcto, esta sentencia, en vez de ser una select, sería una insert en la nueva tabla.

    Ya comentas

    miércoles, 24 de octubre de 2018 7:19
  • Carlos,

    Muy interesante el problema y gracias por postear estructura de tabla y data de ejemplo. Solo falto saber que version de SQL Server usas, pues desde la version 2012 contamos confunciones de ventana que serian de mucha ayuda para resolver este problema.

    Me parece que a la final necesitamos los ultimos dos grupos de calificacion agrupada por cada cliente.  Entiendase como grupo a las filas consecutivas con igual calificacion agrupada ordenadas por fecha de encuesta y id de encuesta (Este problema lo conocemos como identificar islas (finding islands)).

    Ejemplo:

    Cliente: 10014760

    Id_Encuesta Id_Cliente Fecha_Encuesta                 Calificacion Calificacion_Agrupada  grupo
    E2585759         10014760 2017-06-09 12:39:10.000 10                 A                                1
    E3809315         10014760 2017-09-16 18:31:52.000 9                 A                                1
    E4968314         10014760 2017-12-22 03:50:44.000 8                 B                                2
    E9213303         10014760 2018-10-11 09:14:29.000 7                 B                                2

    Supongamos que insertamos otra encuesta para este cliente y que la calificacion agrupada es "C":

    Id_Encuesta Id_Cliente Fecha_Encuesta                 Calificacion Calificacion_Agrupada  grupo
    E2585759         10014760 2017-06-09 12:39:10.000 10                 A                                1
    E3809315         10014760 2017-09-16 18:31:52.000 9                 A                                1
    E4968314         10014760 2017-12-22 03:50:44.000 8                 B                                2
    E9213303         10014760 2018-10-11 09:14:29.000 7                 B                                2
    E7777771          10014760 2018-10-23 10:00:00.000  6                      C                                3

    Si tomamos los dos grupos mas recientes (por cada cliente):

    Id_Cliente Calificacion_Agrupada  grupo
    10014760 B                                2
    10014760 C                                3

    entonces podemos usar las funciones de off-set LAG/LEAD para comparar la calificacion del mas reciente con su anterior.  En este caso "C" (mas reciente) con "B" (anterior inmediato).

    DECLARE @Ejemplo_Encuestas table (
      [Id_Encuesta] nvarchar(15) NULL,
      [Id_Cliente] nvarchar(15) NULL,
      [Fecha_Encuesta] [datetime] NULL,
      [Calificacion] [float] NULL,
      [Calificacion_Agrupada] nchar(1) NULL
    )
    
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E1183422', N'15152222', CAST(0x0000A72401166F4C AS datetime), 10, N'A ');
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E2761000', N'15887888', CAST(0x0000A85800BD68AC AS datetime), 4, N'C ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E6111502', N'10005922', CAST(0x0000A8A800153EAC AS datetime), 0, N'C ');
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E4370063', N'10005922', CAST(0x0000A82000551DD8 AS datetime), 10, N'A ');
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E9213303', N'10014760', CAST(0x0000A97600984B1C AS datetime), 7, N'B ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E4968314', N'10014760', CAST(0x0000A851003F5F70 AS datetime), 8, N'B ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E3809315', N'10014760', CAST(0x0000A7F001316220 AS datetime), 9, N'A ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E2585759', N'10014760', CAST(0x0000A78D00D082E8 AS datetime), 10, N'A ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E5003484', N'10036018', CAST(0x0000A856005B00E0 AS datetime), 10, N'A ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E3310246', N'10036018', CAST(0x0000A7C800DB2784 AS datetime), 9, N'A ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E5160256', N'10050175', CAST(0x0000A863005BE7BC AS datetime), 10, N'A ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E970395', N'10050175', CAST(0x0000A714010E4A88 AS datetime), 1, N'C ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E8777911', N'10096264', CAST(0x0000A95900AB2994 AS datetime), 9, N'A ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E4271133', N'10096264', CAST(0x0000A81800A64BE0 AS datetime), 5, N'C ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E3149569', N'10096264', CAST(0x0000A7BA00F92F04 AS datetime), 6, N'C ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E4287335', N'10148833', CAST(0x0000A8190034D244 AS datetime), 8, N'B ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E2761406', N'10148833', CAST(0x0000A79A00909A5C AS datetime), 9, N'A ');
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E6504352', N'32676535', CAST(0x0000A8C500B623BC AS datetime), 8, N'B')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E5028381', N'32676535', CAST(0x0000A85800BD68AC AS datetime), 9, N'A')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E3912375', N'32676535', CAST(0x0000A7FA00999A44 AS datetime), 10, N'A ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E2398215', N'32676535', CAST(0x0000A78000C927B4 AS datetime), 7, N'B ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E1183763', N'32676535', CAST(0x0000A72401166F4C AS datetime), 6, N'C ');
    
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
    VALUES
    ('E1111111', '1013977', '2017-12-06 03:43:06.000', 9, 'A'),
    ('E2222222', '1013977', '2017-09-01 12:19:20.000', 9, 'A'),         
    ('E3333333', '1013977', '2017-06-01 10:38:47.000', 8, 'B'),         
    ('E4444444', '1013977', '2017-02-24 16:56:43.000', 9, 'A');
    														
    SELECT * 
    FROM @Ejemplo_Encuestas
    ORDER BY Id_Cliente, Fecha_Encuesta, Id_Encuesta;
    
    WITH R1 AS (
    -- identificar cuando la calificacion agregada cambia
    SELECT
    	*,
    	CASE
    	WHEN LAG(Calificacion_Agrupada, 1, Calificacion_Agrupada) OVER(PARTITION BY Id_Cliente ORDER BY Fecha_Encuesta, Id_Encuesta) = Calificacion_Agrupada THEN 0
    	ELSE 1
    	END AS grp_helper
    FROM
    	@Ejemplo_Encuestas
    )
    , R2 AS (
    -- sumar bandera para identificar grupos
    SELECT
    	*,
    	SUM(grp_helper) OVER(
    	PARTITION BY Id_Cliente
    	ORDER BY Fecha_Encuesta, Id_Encuesta
    	ROWS UNBOUNDED PRECEDING
    	) AS grp
    FROM
    	R1
    )
    , R3 AS (
    -- agrupar y agregar
    SELECT
    	Id_Cliente,
    	grp,
    	MIN(Calificacion_Agrupada) AS cal_agp,
    	MIN(Fecha_Encuesta) AS min_fe,
    	MAX(Fecha_Encuesta) AS max_fe
    FROM
    	R2
    GROUP BY
    	Id_Cliente,
    	grp
    )
    , R4 AS (
    -- enumerar grupos para cada cliente
    -- mas reciente sera 1
    SELECT
    	*,
    	ROW_NUMBER() OVER(PARTITION BY Id_Cliente ORDER BY min_fe DESC, grp) AS grp_num
    FROM
    	R3
    )
    , R5 AS (
    -- calcular previos solo para los dos grupos mas recientes pora cada cliente
    SELECT
    	*,
    	LEAD(grp_num, 1, grp_num) OVER(PARTITION BY Id_Cliente ORDER BY grp_num) AS prv_grp_num,
    	LEAD(cal_agp, 1, cal_agp) OVER(PARTITION BY Id_Cliente ORDER BY grp_num) AS prv_cal_agp,
    	LEAD(min_fe, 1, min_fe) OVER(PARTITION BY Id_Cliente ORDER BY grp_num) AS prv_min_fe,
    	LEAD(max_fe, 1, max_fe) OVER(PARTITION BY Id_Cliente ORDER BY grp_num) AS prv_max_fe
    FROM
    	R4
    WHERE
    	grp_num < 3
    )
    -- selecionar grupo mas reciente por cada cliente
    SELECT
        Id_Cliente,
        grp_num,
        min_fe,
        max_fe,
        cal_agp,
        prv_grp_num,
        prv_min_fe,
        prv_max_fe,
        prv_cal_agp
    FROM
        R5
    WHERE
        grp_num = 1;
    GO

    Te dejo de tarea que realizes la comparacion (cal_agp vs. prv_cal_agp) para generar la columna indicando si hubo cambio o no.

    He adicionado las filas en tu ultimo ejemplo.

    Puedes leer sobre este tema y mas en el ultimo libro de Itzik Ben-Gan sobre T-SQL Querying.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    • Editado HunchbackMVP miércoles, 24 de octubre de 2018 17:14 Adicionar mas filas con distinto patron
    miércoles, 24 de octubre de 2018 13:08
  • Antes que nada, muchas gracias por tu tiempo amigo.

    Cerca, muy cerca, casi te sale... pero no cumple para casos como por ejemplo:

    Id_Encuesta	Id_Cliente	Fecha_Encuesta	          Calificacion	Calificacion_Agrupada
    E1111111	1013977	        2017-12-06 03:43:06.000	  9	        A         
    E2222222	1013977	        2017-09-01 12:19:20.000	  9	        A         
    E3333333	1013977	        2017-06-01 10:38:47.000	  8	        B         
    E4444444	1013977	        2017-02-24 16:56:43.000	  9	        A         
    En este caso hay una variación para "mejoría" es decir ahora es "A" y antes fue "B", estos no deben ser considerados tampoco.

    miércoles, 24 de octubre de 2018 16:54
  • Muchas gracias por tu tiempo y por el detalle de la explicación amigo eso se valora =)

    La versión que utilizamos es SQL SERVER 2008-R2 y como que por acá no tienen intensiones de hacer una actualización por el momento.

    Lamentablemente no dispone de las funciones LAG/LEAD.

    miércoles, 24 de octubre de 2018 17:15
  • Por eso es importante postear la version de SQL Server en uso cuando se postea una pregunta como esta.

    La logica sigue siendo la misma, lo que cambiaremos es el metodo de identificar grupos de filas continuas por cliente, clasificacion agregada y fecha de encuesta.

    DECLARE @Ejemplo_Encuestas table (
      [Id_Encuesta] nvarchar(15) NULL,
      [Id_Cliente] nvarchar(15) NULL,
      [Fecha_Encuesta] [datetime] NULL,
      [Calificacion] [float] NULL,
      [Calificacion_Agrupada] nchar(1) NULL
    )
    
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E1183422', N'15152222', CAST(0x0000A72401166F4C AS datetime), 10, N'A ');
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E2761000', N'15887888', CAST(0x0000A85800BD68AC AS datetime), 4, N'C ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E6111502', N'10005922', CAST(0x0000A8A800153EAC AS datetime), 0, N'C ');
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E4370063', N'10005922', CAST(0x0000A82000551DD8 AS datetime), 10, N'A ');
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E9213303', N'10014760', CAST(0x0000A97600984B1C AS datetime), 7, N'B ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E4968314', N'10014760', CAST(0x0000A851003F5F70 AS datetime), 8, N'B ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E3809315', N'10014760', CAST(0x0000A7F001316220 AS datetime), 9, N'A ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E2585759', N'10014760', CAST(0x0000A78D00D082E8 AS datetime), 10, N'A ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E5003484', N'10036018', CAST(0x0000A856005B00E0 AS datetime), 10, N'A ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E3310246', N'10036018', CAST(0x0000A7C800DB2784 AS datetime), 9, N'A ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E5160256', N'10050175', CAST(0x0000A863005BE7BC AS datetime), 10, N'A ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E970395', N'10050175', CAST(0x0000A714010E4A88 AS datetime), 1, N'C ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E8777911', N'10096264', CAST(0x0000A95900AB2994 AS datetime), 9, N'A ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E4271133', N'10096264', CAST(0x0000A81800A64BE0 AS datetime), 5, N'C ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E3149569', N'10096264', CAST(0x0000A7BA00F92F04 AS datetime), 6, N'C ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E4287335', N'10148833', CAST(0x0000A8190034D244 AS datetime), 8, N'B ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E2761406', N'10148833', CAST(0x0000A79A00909A5C AS datetime), 9, N'A ');
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E6504352', N'32676535', CAST(0x0000A8C500B623BC AS datetime), 8, N'B')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E5028381', N'32676535', CAST(0x0000A85800BD68AC AS datetime), 9, N'A')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E3912375', N'32676535', CAST(0x0000A7FA00999A44 AS datetime), 10, N'A ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E2398215', N'32676535', CAST(0x0000A78000C927B4 AS datetime), 7, N'B ')
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
      VALUES (N'E1183763', N'32676535', CAST(0x0000A72401166F4C AS datetime), 6, N'C ');
    
    INSERT @Ejemplo_Encuestas ([Id_Encuesta], [Id_Cliente], [Fecha_Encuesta], [Calificacion], [Calificacion_Agrupada])
    VALUES
    ('E1111111', '1013977', '2017-12-06 03:43:06.000', 9, 'A'),
    ('E2222222', '1013977', '2017-09-01 12:19:20.000', 9, 'A'),         
    ('E3333333', '1013977', '2017-06-01 10:38:47.000', 8, 'B'),         
    ('E4444444', '1013977', '2017-02-24 16:56:43.000', 9, 'A');
    														
    SELECT * 
    FROM @Ejemplo_Encuestas
    ORDER BY Id_Cliente, Fecha_Encuesta, Id_Encuesta;
    
    WITH R1 AS (
    -- identificar grupos
    SELECT
    	*,
    	ROW_NUMBER() OVER(PARTITION BY Id_Cliente ORDER BY Fecha_Encuesta, Id_Encuesta) -
    	ROW_NUMBER() OVER(PARTITION BY Id_Cliente, Calificacion_Agrupada ORDER BY Fecha_Encuesta, Id_Encuesta) AS grp
    FROM
    	@Ejemplo_Encuestas
    )
    , R2 AS (
    -- agrupar y agregar
    SELECT
    	Id_Cliente,
    	grp,
    	MIN(Calificacion_Agrupada) AS cal_agp,
    	MIN(Fecha_Encuesta) AS min_fe,
    	MAX(Fecha_Encuesta) AS max_fe
    FROM
    	R1
    GROUP BY
    	Id_Cliente,
    	grp
    )
    , R3 AS (
    -- enumerar grupos para cada cliente
    -- mas reciente sera 1
    SELECT
    	*,
    	ROW_NUMBER() OVER(PARTITION BY Id_Cliente ORDER BY min_fe DESC, grp) AS grp_num
    FROM
    	R2
    )
    , R4 AS (
    -- seleccionar los dos mas recientes por cliente SELECT * FROM R3 WHERE grp_num < 3 ) -- unir grupo uno con dos por cada cliente SELECT R4.Id_Cliente, R4.grp_num, R4.min_fe, R4.max_fe, R4.cal_agp, R5.grp_num AS prv_grp_num, R5.min_fe AS prv_min_fe, R5.max_fe AS prv_max_fe, R5.cal_agp AS prv_cal_agp, CASE WHEN R4.cal_agp > ISNULL(R5.cal_agp, R4.cal_agp) THEN 'SI' ELSE 'NO' END AS Variacion_Negativa FROM R4 LEFT OUTER JOIN R4 AS R5 ON R5.Id_Cliente = R4.Id_Cliente AND R5.grp_num = R4.grp_num + 1 WHERE R4.grp_num = 1;


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    • Marcado como respuesta Carlos_JPQ miércoles, 24 de octubre de 2018 22:34
    miércoles, 24 de octubre de 2018 18:10
  • Hola Carlos_JPQ:

    Otro cliente {"B";"B";"B";"A"} tiene 04 encuestas, tiene calificación "B" desde hace un tiempo, pero en algún momento fué "A", entonces también debe marcarse como "SI".

    Esa causística que indicas ahora, no estaba en la primera puesta de datos, y encajaba con esta.

    No obstante, Hunchback te ha dado, la solución mucho mejor que yo.

    Saludos

    miércoles, 24 de octubre de 2018 19:48
  • Hola Carlos_JPQ:

    Otro cliente {"B";"B";"B";"A"} tiene 04 encuestas, tiene calificación "B" desde hace un tiempo, pero en algún momento fué "A", entonces también debe marcarse como "SI".

    Esa causística que indicas ahora, no estaba en la primera puesta de datos, y encajaba con esta.

    No obstante, Hunchback te ha dado, la solución mucho mejor que yo.

    Saludos

    Tienes razón, muchas gracias igual.

    miércoles, 24 de octubre de 2018 22:35
  • Por eso es importante postear la version de SQL Server en uso cuando se postea una pregunta como esta.

    La logica sigue siendo la misma, lo que cambiaremos es el metodo de identificar grupos de filas continuas por cliente, clasificacion agregada y fecha de encuesta.

    DECLARE @Ejemplo_Encuestas table (
      [Id_Encuesta] nvarchar(15) NULL,
    

    Tienes razón, la próxima ves indicaré también la versión para no generar un trabajo adicional.

    Muchísimas gracias por tu ayuda ahora podré continuar ya que me había atorado en este punto. 

    Espero en el futuro tener tu nivel en SQL o porlomenos acercarme =)


    miércoles, 24 de octubre de 2018 22:39