Sql server 如何获取这些数据?
我有这样的想法:Sql server 如何获取这些数据?,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,我有这样的想法: Time EQID STATUS USER 12:12am EQ1 0 SA 12:14am EQ1 1 SA 02:30am EQ2 0 SA 03:30am EQ2 1 SA 05:30am EQ1 0 SA 06:30am EQ2 1 SA 现在所需的输出是: In_time
Time EQID STATUS USER
12:12am EQ1 0 SA
12:14am EQ1 1 SA
02:30am EQ2 0 SA
03:30am EQ2 1 SA
05:30am EQ1 0 SA
06:30am EQ2 1 SA
现在所需的输出是:
In_time Out_time EQID USER
12:12am 12:14am EQ1 SA
02:30am 03:30am EQ2 SA
05:30am 06:30am EQ1 SA
此处In_time
是状态为“0”的时间,Out_time
是状态为“1”的时间。如何为特定设备和用户获取此输入时间
和输出时间
注意:像这样,我有这么多的行和多个用户,我如何才能得到它?一种方法是对Status=0的所有行进行主查询。这将为您提供所有列,除了
out\u time
此外,还有一个相关子查询,用于获取out\u time
并获取第一行(按time
排序),其中EQID和User与主查询相同,状态为1,并且time
大于主查询中的time
(换句话说,
out\u Time
是状态为1且大于当前状态为0行的设备和用户的最小Time
。一种方法是对状态为0的所有行进行主查询。这将为您提供所有列,除了out\u time
此外,还有一个相关子查询,用于获取out\u time
并获取第一行(按time
排序),其中EQID和User与主查询相同,状态为1,并且time
大于主查询中的time
(换句话说,
out\u Time
是状态为1且大于当前状态为0行的设备和用户的最小时间
您正在将TIME
存储为VARCHAR
您存储的时间中没有日期
,因此无法确定用户在某一天打卡但在下一天没有打卡
declare @table table ( [Time] varchar(64),
EQID char(3),
[STATUS] int,
[USER] char(2))
insert into @table
values
('12:12am','EQ1',0,'SA'),
('12:14am','EQ1',1,'SA'),
('02:30am','EQ2',0,'SA'),
('03:30am','EQ2',1,'SA'),
('05:30am','EQ1',0,'SA'),
('06:30am','EQ2',1,'SA')
;with cte as(
select
[Time]
,EQID
,[USER]
,[Status]
,RN = row_number() over(partition by [USER] order by cast(stuff([Time],6,0,' ') as time))
from
@table t)
select
In_Time = i.[Time]
,Out_Time = o.[Time]
,i.EQID
,i.[USER]
from
cte i
left join cte o on
o.[USER] = i.[USER]
and o.RN = i.RN + 1
where
i.[STATUS] = 0
你这里有一些问题
TIME
存储为VARCHAR
declare @table table ( [Time] varchar(64),
EQID char(3),
[STATUS] int,
[USER] char(2))
insert into @table
values
('12:12am','EQ1',0,'SA'),
('12:14am','EQ1',1,'SA'),
('02:30am','EQ2',0,'SA'),
('03:30am','EQ2',1,'SA'),
('05:30am','EQ1',0,'SA'),
('06:30am','EQ2',1,'SA')
;with cte as(
select
[Time]
,EQID
,[USER]
,[Status]
,RN = row_number() over(partition by [USER] order by cast(stuff([Time],6,0,' ') as time))
from
@table t)
select
In_Time = i.[Time]
,Out_Time = o.[Time]
,i.EQID
,i.[USER]
from
cte i
left join cte o on
o.[USER] = i.[USER]
and o.RN = i.RN + 1
where
i.[STATUS] = 0
请只将句子的第一个单词、人名和I大写。不要随意将其他单词大写,这会使阅读变得更困难。@MarkRotteveel好的……示例数据中的最后一个记录不应该是
EQ1
?@MichałTurczyn是的,它是EQ1。我必须像问题中提到的那样捕获n次,哪个数据类型是列“时间“?请仅将句子的第一个单词、人名和I大写。不要随意将其他单词大写,它使事情更难阅读。@Markrottveel好的……示例数据中的最后一条记录不应该是EQ1
?@MichałTurczyn是的,它是EQ1。我必须像问题中提到的那样捕获n次,哪种数据类型是“时间”列?不明白你能写一个示例查询@TabAllemanI编辑了答案以清楚。我不会为您编写查询,但如果您尝试,我将帮助您调试它。正在获取子查询返回多个值。。请帮助这一点让我抓狂从早上起就一直在这样做请帮助您的子查询可能只需要选择列表中的前1个,但是您需要发布查询以便我调试它。@saibharath当您查找大于您正在查看的行的Time
时,您的条件可能匹配多行。在我的示例答案中,我使用了一个TOP 1
子查询,只返回1个结果,而不是在您查看的输入时间之后的所有匹配时间。没有得到您可以请您在@TabAllemanI编写一个示例查询。为了清楚起见,我编辑了答案。我不会为您编写查询,但如果您尝试,我将帮助您调试它。正在获取子查询返回多个值。。请帮助这一点让我抓狂从早上起就一直在这样做请帮助您的子查询可能只需要选择列表中的前1个,但是您需要发布查询以便我调试它。@saibharath当您查找大于您正在查看的行的Time
时,您的条件可能匹配多行。在我的示例回答中,我使用了一个TOP 1
子查询,只返回1个结果,而不是在查看的输入时间之后的所有匹配时间。您的连接条件查询没有充分关联。它不考虑EQID或用户。@ TabLaMeNe他的示例不考虑这些字段,否则“EQ1”的外出时间不会是6:30AM。该值属于EQ2
。我想可以假设用户需要是相同的,但是…实际上在注释中,OP指出最后一个示例行应该是EQ1。不过,到目前为止,该问题尚未对其进行编辑。但在所需输出之后的段落中,OP指出EQID和User必须同时考虑。同意,这应该有效,这是我在回答中建议的一种书写方式。@TabAlleman哦!我不是故意踩你的脚。我只是试着写答案来练习我自己的能力,但OP没有清楚地理解你想要教什么(不是你自己的错)。抱歉破坏了学习体验!您的连接条件查询没有充分关联。它不考虑EQID或用户。@ TabLaMeNe他的示例不考虑这些字段,否则“EQ1”的外出时间不会是6:30AM。该值属于EQ2
。我想可以假设用户需要是相同的,但是…实际上在注释中,OP指出最后一个示例行应该是EQ1。不过,到目前为止,该问题尚未对其进行编辑。但是在后面的段落中是的