Je voudrais obtenir les données de la ligne précédente. J'ai utilisé la fonction LAG mais je n'ai pas obtenu le résultat attendu.

Table:-

col1  col2  col3
ABCD    1   Y
ABCD    2   N
ABCD    3   N
EFGH    4   N
EFGH    5   Y
EFGH    6   N
XXXX    7   Y

Résultat attendu

col1 col2 col3  col4
ABCD    1   A   NULL
ABCD    2   B   A
ABCD    3   C   B
EFGH    4   A   NULL
EFGH    5   B   A
EFGH    6   E   B
XXXX    7   F   NULL

Col4 doit contenir les données du regroupement de lignes précédent par la valeur de Col1. Veuillez me faire savoir comment cela peut être réalisé.

2
Krishna 23 mai 2018 à 16:22

4 réponses

Meilleure réponse

Utilisez la fonction lag()

select *, lag(col3) over (partition by col1 order by col2) as col4
from table t;

Cependant, vous pouvez également utiliser subquery si votre SQL ne dispose pas de LAG()

select *,   
        (select top 1 col3
         from table
         where col1 = t.col1 and col2 < t.col2
         order by col2 desc
        ) as col4
from table t;
4
Yogesh Sharma 23 mai 2018 à 13:24

Si vous êtes sur 2008 ou une version antérieure, essayez ceci:

    select t1.col1, t1.col2, t1.col3, t2.col3 as col4
    from table1 t1
    left join table1 t2 on t1.col1 = t2.col1 and t1.col2 - 1 = t2.col2

La fonction lag () correspond aux genoux de l'abeille. Utilisez ça, si vous le pouvez.

0
James 23 mai 2018 à 13:46

Merci à tous pour les réponses. En utilisant la fonction lag avec partition, j'ai obtenu le résultat attendu. J'ai manqué de partition utilisée auparavant et à cause de cela, j'obtenais de mauvais résultats.

-1
Krishna 24 mai 2018 à 06:49

En supposant que SQL Server 2012 ou plus récent ...

SELECT
  *,
  LAG(col3) OVER (PARTITION BY col1 ORDER BY col2) AS col4
FROM
  yourTable

Si vous utilisez SQL Server 2008 ou une version antérieure ...

SELECT
  *,
  (
     SELECT TOP(1) previous.col3
       FROM yourTable   AS previous
      WHERE previous.col1 = yourTable.col1
        AND previous.col2 < yourTable.col2
   ORDER BY previous.col2 DESC
  )
    AS col4
FROM
  yourTable
1
MatBailie 23 mai 2018 à 13:24