2015-02-12 2 views
-1

У меня есть сотрудники таблицы и для данного empid, я хотел бы указать время, имя пользователя и то, что изменилось с предыдущего времени. Кроме того, для столбца «req_type» Я хотел бы написать (нормальный) для 0, (важно) для 1, (срочно) для значения 2.sql server найти разницу между строками одной таблицы

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 

Выберите оператор должен дать мне 3 строки для EmpID = 10, как показано ниже

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 

Аналогично Выбери оператор должен дать мне 2 строки для EmpID = 12, как показано ниже

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 
+0

Вставьте в себя попытку, и мы сможем помочь вам настроить ее. Также вы упомянули 2 РСУБД, что это? – SoulTrain

+0

Пожалуйста, поделитесь своим SQL, который вы уже пробовали. –

+0

Присоедините таблицу к себе на empid и Row_Number() -1, а затем примените свои бизнес-правила для создания значения «Изменено». –

ответ

0

Это частичный ответ, который мы должны преобразовать окончательный вывод в пространстве текста, разделенные по ому 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 
+0

С cte AS дает ошибку компиляции. В последнем утверждении, что означает reqc + tokenc? – user1651888

+0

ok, вместо: WITH cts AS инструкция теперь изменена, чтобы выбрать * from (SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY td asc) rn FROM employee ) как cte (Но теперь он дает синтаксическую ошибку над оператором select *, ROW_NUMBER – user1651888

Смежные вопросы