我有一个像这样的桌子:
CustName Country RecordedTime
---------------------------------------------
Alex Australia 2018-Jun-01 08:00 AM
Alex China 2018-Jun-01 10:00 AM
Alex Japan 2018-Jun-01 11:00 AM
John Australia 2018-Jun-01 08:00 AM
John China 2018-Jun-02 08:00 AM
Bob Australia 2018-Jun-02 09:00 AM
Bob Brazil 2018-Jun-03 09:50 AM
如果记录是系统中的全新记录,则在给定日期的“审计”和“历史记录”字段(结果集中的两个附加字段)中应显示“ ADD”和“ NEW”。
如果该记录当天被编辑了两次,则在给定日期,应在审核字段中分别显示两个带有“ ADD”和“ CHANGE”的条目,在“历史记录”状态字段中显示“ BEFORE”和“ CURRENT”。
例如,这就是我的结果应显示的样子;
当我输入输入日期为2018年6月1日时,输出应如下所示:
CustName Country RecordedTime Audit History
----------------------------------------------------------------
Alex Australia 2018-Jun-01 08:00 AM ADD NEW
Alex China 2018-Jun-01 10:00 AM CHANGE BEFORE
Alex Japan 2018-Jun-01 11:00 AM CHANGE CURRENT
John Australia 2018-Jun-01 08:00 AM ADD NEW
当我输入输入日期为2018年6月2日时,输出应如下所示:
CustName Country RecordedTime Audit History
-----------------------------------------------------------------
John China 2018-Jun-02 08:00 AM CHANGE CURRENT
Bob Australia 2018-Jun-02 09:00 AM ADD NEW
当我输入输入日期为2018年6月2日时,输出应如下所示:
CustName Country RecordedTime Audit History
----------------------------------------------------------------
Bob Brazil 2018-Jun-03 09:50 AM CHANGE CURRENT
我尝试了许多方法,但仍然缺少实现这一目标的一些方案。有人可以对此有所说明吗?
答案 0 :(得分:2)
答案 1 :(得分:1)
答案 2 :(得分:1)
您可以尝试。
CASE WHEN
和RANK
,具有 Windows功能
;WITH CTE (CustName,Country,RecordedTime,rn) AS(
SELECT *,RANK() OVER(PARTITION BY CustName ORDER BY RecordedTime) rn
FROM T
)
SELECT t.*,
(CASE WHEN rn = 1 then 'ADD' ELSE 'CHANGE' END) 'Audit',
(CASE
WHEN rn = 1 then 'NEW'
WHEN t2.mRn = rn then 'CURRENT'
ELSE 'BEFORE' END) 'History'
FROM CTE t LEFT JOIN (
SELECT MAX(rn) mRn,CustName FROM CTE GROUP BY CustName
) t2 on t2.mRn = t.rn and t2.CustName = t.CustName
WHERE CONVERT(char(10), RecordedTime,126) = '2018-06-02'
sqlfiddle:http://sqlfiddle.com/#!18/43c08/26