我是SQL的初学者,我在SQL方面有以下问题。
我需要一个SQL查询,它可以计算字段idpersone中具有相同值的两个连续行之间的差异,并将它们重新分组到一行中。
例如,我需要将我的表转换为所需的数据,如下所示:
Table data:
idLigne | idperson | statut
--------|----------|-------
L1 1 A
L2 1 B
L3 1 A
L4 1 B
L5 2 A
L6 2 B
L7 3 A
L8 3 B
Desired output:
idLigne | idpersonne | firstLighe | secondLigne
--------|------------|------------|------------
L2-L1 1 L1 L2
L4-L3 1 L3 L4
L6-L5 2 L5 L6
L8-L7 2 L7 L8发布于 2012-05-05 00:15:01
您可以尝试如下所示:
DECLARE @MyTable TABLE(idLigne VARCHAR(2), idperson INT, statut CHAR(1));
INSERT INTO @MyTable VALUES ('L1',1,'A')
, ('L2',1,'B')
, ('L3',1,'A')
, ('L4',1,'B')
, ('L5',2,'A')
, ('L6',2,'B')
, ('L7',3,'A')
, ('L8',3,'B')
; WITH a AS (
SELECT idLigne=t2.idLigne+'-'+t1.idLigne
, idpersonne=t1.idperson
, firstLigne=t1.idLigne
, secondLigne=t2.idLigne
, r1=ROW_NUMBER()OVER(PARTITION BY t1.idLigne ORDER BY t2.idLigne)
, r2=ROW_NUMBER()OVER(PARTITION BY t2.idLigne ORDER BY t1.idLigne)
FROM @MyTable t1
INNER JOIN @MyTable t2 ON t1.idperson=t2.idperson AND t1.statut='A' AND t2.statut='B'
)
SELECT idLigne
, idpersonne
, firstLigne
, secondLigne
FROM a WHERE r1=r2
GO结果:

发布于 2012-05-05 00:01:32
简单的解决方案是这样的……
如果同一个idperson有三个记录,我不确定您想要做什么。或者,如果序列记录具有不同的idperson,该怎么办。
WITH
sequenced_data
AS
(
SELECT
ROW_NUMBER() OVER (PARTITION BY idperson ORDER BY idLigne) AS sequence_id,
*
FROM
myTable
)
SELECT
*
FROM
myTable as firstLigne
LEFT JOIN
myTable as secondLigne
ON secondLigne.idperson = firstLigne.idperson
AND secondLigne.sequence_id = firstLigne.sequence_id + 1
WHERE
(firstLigne.sequence_id % 2) = 1发布于 2012-05-05 11:45:20
我不能准确地推断出你的问题的意图。但它是这样的:
with a as
(
select *,
(row_number() over(order by idLigne, idperson) - 1) / 2 as pair_number
from tbl
)
select
max(idligne) + '-' + min(idligne) as idLigne,
min(idperson) as idpersonne,
min(idLigne) as firstlighe, max(idLigne) as secondLigne
from a
group by pair_number输出:
IDLIGNE IDPERSONNE FIRSTLIGHE SECONDLIGNE
L2-L1 1 L1 L2
L4-L3 1 L3 L4
L6-L5 2 L5 L6
L8-L7 3 L7 L8实时测试:http://www.sqlfiddle.com/#!3/26371/20
https://stackoverflow.com/questions/10452173
复制相似问题