首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何按以下要求从Server检索数据?

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

Stack Overflow用户
提问于 2018-06-25 18:49:56
回答 2查看 69关注 0票数 1

我有一张这样的桌子:

代码语言:javascript
复制
  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’。

如果记录当天被编辑了两次,那么它应该为给定的日期显示两个条目,分别在审核字段中添加‘& 'CHANGE’和‘在History状态字段中的’& 'CURRENT‘。

例如,这就是我的结果应该出现的方式;

当我将输入日期改为2018-6月-01时,输出应该如下:

代码语言:javascript
复制
   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月-02时,输出应如下所示:

代码语言:javascript
复制
   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月-02时,输出应如下所示:

代码语言:javascript
复制
   CustName    Country    RecordedTime           Audit    History
  ----------------------------------------------------------------
   Bob         Brazil     2018-Jun-03 09:50 AM   CHANGE   CURRENT

我尝试了许多方法,但我仍然缺少一些方案来实现这一点。谁能帮我弄清楚这件事吗?

EN

回答 2

Stack Overflow用户

发布于 2018-06-25 19:18:51

我只需使用case表达式。

代码语言:javascript
复制
select t.*,
       (case when seqnum = 1 then 'ADD' else 'CHANGE' end) as audit,
       (case when seqnum = 1 then 'NEW'
             when seqnum_day = 1 then 'CURRENT'
             else 'BEFORE'
        end) as history
from (select t.*,
             row_number() over (partition by custname order by recordedtime) as seqnum,
             row_number() over (partition by custname, cast(recordedtime as date) order by recordedtime desc) as seqnum_day
      from t
     ) t;

方形小提琴:http://sqlfiddle.com/#!18/43c08/27

票数 2
EN

Stack Overflow用户

发布于 2018-06-25 19:21:16

你可以试试。

具有Windows功能的CASE WHENRANK

代码语言:javascript
复制
;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'

方形小提琴:http://sqlfiddle.com/#!18/43c08/26

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51030093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档