SQL Server 如何在SQL中获得某个条件后的第一个状态?

h5qlskok  于 2023-01-08  发布在  其他
关注(0)|答案(1)|浏览(219)

在SQL中,我有一个数据,我是带着一定的条件带过来的,下面是从表中拉出来的带[Status] = 0的数据,但是表中还有带[Status] = 1[Status] = 2的数据,在我想要的带[Status] = 0的数据之后,我还想得到与[Status] = 1[Status] = 2同名的[CL_Name],但我做不到,我的示例表如下。
| 姓名|时间戳|设备|CL_名称|现况|
| - ------|- ------|- ------|- ------|- ------|
| 涂胶输送机|2023年1月3日16时45分34.243秒|A类|稳定剂|无|
| 涂胶输送机|2023年1月3日16时50分34.247秒|A类|稳定剂|无|
| 涂胶输送机|2023年1月3日16时55分34.247秒|A类|稳定剂|无|
| 涂胶输送机|2023年1月3日17时00分34.247秒|A类|稳定剂|1个|
| 涂胶输送机|2023年1月3日17时05分34.247秒|A类|稳定剂|1个|
| 滚动平台|2023年1月3日18时05分34.247秒|B|真空|无|
| 滚动平台|2023年1月3日18时10分34.247秒|B|真空|1个|
| 滚动平台|2023年1月3日18时15分34.247秒|B|真空|1个|
我想在这里返回[Status] = 0,并且根据下一个[Status] = 1还是[Status] = 2返回每个[CL_Name] [Status] = 0
我的SQL代码是这样的:

SELECT [Name]
      ,[TIMESTAMP]
      ,[Equipment]
      ,[CL_Name]
      ,[Status]
      --,(case when [Status] > 0 then [TIMESTAMP] end) OVER ( PARTITION BY [CL_Name]) as EndTime
  FROM [dbo].[Cockpit]
  where [TIMESTAMP] > DATEADD(day,-1,GETDATE()) and [Status] = 0
  group by [Name], [Equipment], [Name], [TIMESTAMP], [Status]

我正在制作的表看起来像这样
| 姓名|时间戳|设备|CL_名称|现况|总时间最小值|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 涂胶输送机|2023年1月3日16时45分34.243秒|A类|稳定剂|无|十五|
| 涂胶输送机|2023年1月3日17时00分34.247秒|A类|稳定剂|1个||
| 滚动平台|2023年1月3日18时05分34.247秒|B|真空|无|五个|
| 滚动平台|2023年1月3日18时10分34.247秒|B|真空|1个||
我该如何进行此查询?

nfg76nw0

nfg76nw01#

语法略有不同,因为现在没有SQL服务器,但逻辑应该是相同的。
1.选择所需的值,即仅保留所需的记录
1.计算Min where status =0min where status =1(列-status_0_ts, status_1_ts
1.如果Status =0,则减去这2列并计算差值,否则为NULL

    • P.S.**-缺少[TIMESTAMP] > DATEADD(day,-1,GETDATE()),请随意添加到您认为合适的位置
    • 代码**
Select *, 
min(case when "Status" = 0 then "min_timestamp" else null end) over (partition by "Name", "CL_Name", "Equipment") status_0_ts,
min(case when "Status" = 1 then "min_timestamp" else null end) over (partition by "Name", "CL_Name", "Equipment") status_1_ts,
CASE WHEN "Status" = 0 
  then 
    min(case when "Status" = 0 then "min_timestamp" else null end) over (partition by "Name", "CL_Name", "Equipment") -
    min(case when "Status" = 1 then "min_timestamp" else null end) over (partition by "Name", "CL_Name", "Equipment") 
  else null 
end as time_diff
from
(
    SELECT "Name", "CL_Name", "Equipment", "Status", min("TIMESTAMP") as "min_timestamp"
    FROM TABLE1
    group by "Name", "CL_Name", "Equipment", "Status"
) K
order by "Name" asc ,"Status" asc
    • 输出:**

| 姓名|CL_名称|设备|现况|最小时间戳|状态_0_ts|状态_1_ts|时间差异|
| - ------| - ------| - ------| - ------| - ------| - ------| - ------| - ------|
| 涂胶输送机|稳定剂|A类|无|2023年1月3日上午16时45分34秒|2023年1月3日上午16时45分34秒|2023年1月3日上午17时00分34秒|0年0月0日0小时-15分钟-0.00秒|
| 涂胶输送机|稳定剂|A类|1个|2023年1月3日上午17时00分34秒|2023年1月3日上午16时45分34秒|2023年1月3日上午17时00分34秒|(无)|
| 滚动平台|真空|乙|无|2023年1月3日上午18时05分34秒|2023年1月3日上午18时05分34秒|2023年1月3日上午18时10分34秒|0年0月0日0小时-5分-0.00秒|
| 滚动平台|真空|乙|1个|2023年1月3日上午18时10分34秒|2023年1月3日上午18时05分34秒|2023年1月3日上午18时10分34秒|(无)|

相关问题