Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql server查找同一表的行之间的差异_Sql_Sql Server - Fatal编程技术网

sql server查找同一表的行之间的差异

sql server查找同一表的行之间的差异,sql,sql-server,Sql,Sql Server,我有一个表employees,对于给定的empid,我想列出时间、用户名以及与上一次相比发生的变化。同样对于列'req_type',我想为0写普通,为1写重要,为值2写紧急 empid Time req_type token requester username comment ------------------------------------------------------------------------------

我有一个表employees,对于给定的empid,我想列出时间、用户名以及与上一次相比发生的变化。同样对于列'req_type',我想为0写普通,为1写重要,为值2写紧急

empid   Time                   req_type     token    requester   username    comment
------------------------------------------------------------------------------------------
10      05-01-2014 10:04:00     0             10      grusel       ann
10      05-01-2014 11:11:00     1              8                   ben       check site www:\\abc.com
10      05-01-2014 10:10:00     0              2                   ann 
12      06-01-2014 13:00:01     0              2       Jeena       bill      check www:\\someerror.com
12      07-02-2014 14:00:00     1              6        Mike       bill
Select语句应该为empid=10提供3行,如下所示

Time                    Username          Changed
---------------------------------------------------------------------------
05-01-2014 11:11:00     ben          'req_type' updated from (normal) to (important), 
                                     'token' updated from 2 to 8,
                                     'requester' deleted,
                                     'comment' added check site www:\\abc.com
05-01-2014 10:10:00     ann          'token' updated from 10 to 2,
                                     'requester' added grusel
05-01-2014 10:04:00     ann           First entry
Time                    Username          Changed
----------------------------------------------------------------------------
7-02-2014 14:00:00     bill           'req_type' updated from (normal) to (important),
                                      'token' changed from 2 to 6,
                                      'requester' changed from Jeena to Mike,
                                      'comment' deleted
6-01-2014 13:00:01      bill           First entry
类似地,Select语句应该为empid=12提供2行,如下所示

Time                    Username          Changed
---------------------------------------------------------------------------
05-01-2014 11:11:00     ben          'req_type' updated from (normal) to (important), 
                                     'token' updated from 2 to 8,
                                     'requester' deleted,
                                     'comment' added check site www:\\abc.com
05-01-2014 10:10:00     ann          'token' updated from 10 to 2,
                                     'requester' added grusel
05-01-2014 10:04:00     ann           First entry
Time                    Username          Changed
----------------------------------------------------------------------------
7-02-2014 14:00:00     bill           'req_type' updated from (normal) to (important),
                                      'token' changed from 2 to 6,
                                      'requester' changed from Jeena to Mike,
                                      'comment' deleted
6-01-2014 13:00:01      bill           First entry

这是一个部分答案,我们必须将最终输出转换为由emp id分隔的文本

CREATE TABLE emp (id int , [time] datetime, req_type int, token int )

INSERT INTO emp VALUES (1, GETDATE(), 0,1)
INSERT INTO emp VALUES (1, GETDATE()-1, 1,1)
INSERT INTO emp VALUES (1, GETDATE()-2, 1,3)

;WITH cte AS
(

SELECT *, ROW_NUMBER() OVER( PARTITION BY id ORDER BY time asc) rn  FROM emp 

),cte2 AS ( 
SELECT c2.*, CASE WHEN c.req_type != c2.req_type THEN 'Req changed from'+CONVERT(VARCHAR,c2.req_type)+' to '+CONVERT(VARCHAR,c.req_type)     ELSE '' END AS reqc, 
CASE WHEN c.token != c2.token THEN 'Token changed from' +CONVERT(VARCHAR,c2.token)+' to '+CONVERT(VARCHAR,c.token) ELSE '' END AS tokenc
 FROM cte c INNER join cte c2 ON c2.rn+1 = c.rn
 )

 SELECT id,time,req_type,reqc+tokenc AS changes FROM cte2 

粘贴在您的尝试,我们可以帮助您调整它。您还提到了2个RDBMS,是哪一个?请共享您迄今为止尝试过的SQL。在empid和行_编号-1上将表自身连接起来,然后应用您的业务规则来构造更改后的值。使用cte AS会产生编译错误。在最后一句话中,reqc+tokenc是什么意思?好的,而不是;使用cts作为语句,现在更改为select*from select*,td asc rn from employee AS cte根据id顺序将行数超额分配,但现在它在select*,行数语句上给出了语法错误