首页 > 解决方案 > 如何创建一个视图,在 SQL 中按类型将两个字段中的日期分开

问题描述

我正在尝试使用此表警报:

ID        CarID  Location           Date          Type
897847    7198      3       2019-11-26 11:54:54    20
897852    7198      3       2019-11-26 11:55:14    21
1001987   7198      3       2019-12-10 16:08:28    20
1001988   7198      3       2019-12-10 16:08:38    21

要创建一个按类型(20 或 21)分隔 Date 的视图,并使用 timediff 计算 then 和尊重相同 carID 和 Location 之间的差异,得到如下结果:

ID        CarID  Location      InicialDate(20)        EndDate(21)          Total
897847    7198      3       2019-11-26 11:54:54   2019-11-26 11:55:14     00:00:20
1001987   7198      3       2019-12-10 16:08:28   2019-12-10 16:08:38     00:00:10

在某些情况下,类型 20 的日期会出现 2,3 或 4 次,然后才会出现类型 21 的日期,所以我需要始终获得第一个日期类型 20 和第一个日期类型 21,第二个类型 20 和第二个类型 21 和如此总是尊重相同的汽车ID和位置,不能是相同的汽车和不同的位置,反之亦然。

有什么可以帮助我的想法吗?谢谢

标签: sqlview

解决方案


对于 SQL Server:-

供参考检查这里

;with cte as (select dense_rank() over( order by CarID,Location,cast(Date as date)) dr,
* from tbl),cte1 as(
select dr,min(ID) ID,CarID,Location,type,min(date) min_date,max(date) max_date from cte
group by dr,CarID,Location,type)
select min(ID) ID,CarID,Location,min(min_date) [InicialDate(20)],max(max_date)[EndDate(21)],
datediff(second,min(min_date),max(max_date)) total
from cte1
group by CarID,Location,dr

对于 MySql:-

供参考检查这里

select min(ID) ID,CarID,Location,min(min_date) as `InicialDate(20)`,max(max_date)as `EndDate(21)`,
TIMESTAMPDIFF(second,min(min_date),max(max_date))as  total
from (
select dr,min(ID) as ID,CarID,Location,type,min(date)as  min_date,max(date) as max_date from (select dense_rank() over( order by CarID,Location,cast(Date as date)) as dr,
ID,CarID,Location,Date,Type from tbl)as cte
group by dr,CarID,Location,type) as cte1
group by CarID,Location,dr;

推荐阅读