Sql 从历史记录表中获取最近更改的值

Sql 从历史记录表中获取最近更改的值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个具有以下值的历史记录表 CREATE TABLE History (SnapShotDate DATETIME, UID VARCHAR(10), DUEDATE DATETIME) INSERT INTO History VALUES ('03-23-2015','PT-01','2015-04-22') INSERT INTO History VALUES ('03-30-2015','PT-01','2015-04-20') INSERT INTO History VALUES

我有一个具有以下值的历史记录表

CREATE TABLE History (SnapShotDate DATETIME, UID VARCHAR(10), DUEDATE DATETIME)

INSERT INTO History VALUES ('03-23-2015','PT-01','2015-04-22')
INSERT INTO History VALUES  ('03-30-2015','PT-01','2015-04-20')
INSERT INTO History VALUES  ('04-06-2015','PT-01','2015-06-30')

INSERT INTO History VALUES  ('03-23-2015','PT-02','2015-04-22')
INSERT INTO History VALUES  ('03-30-2015','PT-02','2015-04-22')
INSERT INTO History VALUES  ('04-06-2015','PT-02','2015-04-22')

INSERT INTO History VALUES  ('03-23-2015','PT-03','2015-04-18')
INSERT INTO History VALUES  ('03-30-2015','PT-03','2015-04-22')
INSERT INTO History VALUES  ('04-06-2015','PT-03','2015-04-22')
我需要以下格式的输出。我需要任何给定UID的最新更改值。请帮我得到下面的结果

输出

 UID    PreviousDueDate  CurrentDueDate
----------------------------------------
 PT-01     2015-04-20      2015-06-30
 PT-02     2015-04-22      2015-04-22
 PT-03     2015-04-18      2015-04-22

谢谢

您可以尝试使用以下SQL:

select UID,date_format(min(DUEDATE), '%Y-%m-%d') as PreviousDueDate,date_format(max(DUEDATE), '%Y-%m-%d') as CurrentDueDate from History group by UID;

您应该在sql server中使用Convert函数

SELECT A.UID
,CONVERT(varchar(10),B.DUEDATE, 20) as PreviousDueDate
,CONVERT(varchar(10),A.DUEDATE, 20) as CurrentDueDate
FROM
(
    SELECT *,row_number() OVER( PARTITION BY UID ORDER BY SnapShotDate DESC) AS ROWID
    FROM History
)A
LEFT JOIN
(
    SELECT *,row_number() OVER( PARTITION BY UID ORDER BY SnapShotDate DESC) AS ROWID
    FROM History
)B ON A.UID=B.UID AND B.ROWID=2
WHERE A.ROWID=1
GROUP BY A.UID,A.DUEDATE,B.DUEDATE
输出:

UID     PreviousDueDate CurrentDueDate
PT-01   2015-04-20      2015-06-30
PT-02   2015-04-22      2015-04-22
PT-03   2015-04-22      2015-04-22
PT-04   2015-04-22      2015-04-18

我以前从未使用过滞后功能,但看起来非常简单

; WITH CTE AS (
  SELECT UID, 
    LAG(DUEDATE,1,NULL) OVER (PARTITION BY UID ORDER BY SnapShotDate ASC) AS PreviousDueDate,
    DUEDATE AS CurrentDueDate,
    ROW_NUMBER() OVER (PARTITION BY UID ORDER BY SnapShotDate DESC) AS RowNumber
  FROM History
)
SELECT UID, PreviousDueDate, CurrentDueDate
FROM CTE
WHERE ROWNUMBER = 1

以下是.

Hmm当记录类似于插入历史值'03-23-2015'、'PT-04'、'2015-04-20'插入历史值'03-30-2015'、'PT-04'、'2015-04-22'插入历史值'04-06-2015'、'PT-04'时,这将不起作用,“2015-04-18”我需要一个使用历史日期并选择最后修改日期的查询。我需要将此逻辑应用于一个类似的需求,该需求有一个文本列而不是DueDate。当您在子查询中按UID分组时,它返回多个值并给我此错误-子查询返回多个值。当子查询在=、!=、=或者当子查询用作表达式时。请为我提供一个查询,在该查询中,我可以对文本列使用此逻辑,而不是Duedate。您可以使用where子句而不是group byI在运行您提供的查询时出现此错误。Msg 195,级别15,状态10,第34行“date_format”不是可识别的内置函数名。date_format是用于格式化日期的MySQL函数。如果您不使用MySQL,那么您可以省略partI-needQ-query格式,该格式通过检查SnapshotDate来提供数据。有时,当前到期日值可能小于上一个到期日`对于PT-03记录,上一个到期日应为2015-04-18,我无法使用您的解决方案获得该值。如果上一个更改的到期日小于上一个到期日,这将不起作用?您能否提供一个使用快照日期的查询,并检查最近更改的值。我需要将此查询应用于文本列,就像我现在对到期日所做的一样。PT-03的上一个到期日应该是2015-04-22,而不是2015-04-18。如果您的一条评论中提到的日期列的数据类型为varchar,为什么要在create table语句中添加datetime?这对试图帮助你的人没有帮助。
; WITH CTE AS (
  SELECT UID, 
    LAG(DUEDATE,1,NULL) OVER (PARTITION BY UID ORDER BY SnapShotDate ASC) AS PreviousDueDate,
    DUEDATE AS CurrentDueDate,
    ROW_NUMBER() OVER (PARTITION BY UID ORDER BY SnapShotDate DESC) AS RowNumber
  FROM History
)
SELECT UID, PreviousDueDate, CurrentDueDate
FROM CTE
WHERE ROWNUMBER = 1
SELECT UID, 
(SELECT MIN(DUEDATE) FROM  History HS WHERE  HS.UID =  H.UID  GROUP BY  UID )AS PreviousDueDate,
(SELECT Max(DUEDATE) FROM  History HS WHERE  HS.UID =  H.UID GROUP BY  UID )AS CurrentDueDate
FROM History  H
GROUP BY UID