如何按照以下要求从SQL Server检索数据?

时间:2018-06-25 18:49:57

标签: sql sql-server sql-server-2008 tsql ssms-2014

我有一个像这样的桌子:

  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

我尝试了许多方法,但仍然缺少实现这一目标的一些方案。有人可以对此有所说明吗?

3 个答案:

答案 0 :(得分:2)

我只会使用 $ google_speech -l en "HERE" 表达式。

case

sqlfiddle:http://sqlfiddle.com/#!18/43c08/27

答案 1 :(得分:1)

一种实现方法是通过如下所示的cte,其中我们具有row_number()函数以双向跟踪序列。

请参见 live demo

apos.create('module-script')

答案 2 :(得分:1)

您可以尝试。

CASE WHENRANK,具有 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

相关问题