对于广泛的标题感到抱歉,因为我不确定如何说出来,但这就是我在做的事情:
我有一个名为Scanner
的表格,其中包含ScannerID
(主键),StaffID
,EventTime
和Status
。此表记录每次在设备上进行扫描并将其记录到EventTime
上的此表中。 StaffID
根据卡片详细信息确定其身份。最后,Status
每次根据StaffID
记录扫描时都会计时,例如:
ScannerID StaffID EventTime Status
1 1 2016-06-24 07:30:00 1
2 1 2016-06-24 13:00:00 2
3 1 2016-06-24 14:00:00 3
4 1 2016-06-24 17:00:00 4
5 2 2016-06-24 08:30:00 1
6 2 2016-06-24 17:30:00 2
问题 根据这些数据,我希望能够在下面的视图中一起阻止这些数据,例如:
StaffID StartDate EndDate
1 2016-06-24 07:30:00 2016-06-24 13:00:00
1 2016-06-24 14:00:00 2016-06-24 17:00:00
这是基于来自Status
的奇数是StartDate,而来自Status
的偶数是EndDate。
其他信息
这是可行的,如果是这样的话,我该怎样才能创建一个视图,或者我可以选择哪些选项可以使用奇异分解中显示的数据?
感谢您对此事的所有帮助和建议
答案 0 :(得分:2)
一个简单的Group By StaffID,((Status + 1)/ 2)将完成这个技巧
您甚至可以添加最小/最大扫描程序
Declare @Table table (ScannerID int,StaffID int,EventTime Datetime,Status int)
Insert into @Table values
(1,1,'2016-06-24 07:30:00',1),
(2,1,'2016-06-24 13:00:00',2),
(3,1,'2016-06-24 14:00:00',3),
(4,1,'2016-06-24 17:00:00',4)
Select StaffID
,StartDate = min(EventTime)
,EndDate = max(EventTime)
From @Table
Group By StaffID,((Status+1)/2)
Order By 1,2
StaffID StartDate EndDate
1 2016-06-24 07:30:00.000 2016-06-24 13:00:00.000
1 2016-06-24 14:00:00.000 2016-06-24 17:00:00.000
答案 1 :(得分:1)
您应该在表格中添加父ID。
StaffID EventTime Status PKId ParentPKId
1 2016-06-24 07:30:00 1 1 0
1 2016-06-24 13:00:00 2 2 1
1 2016-06-24 14:00:00 3 3 0
1 2016-06-24 17:00:00 4 4 3
然后
SELECT
A.StaffID,
A.EventTime AS StartDate,
B.EventTime AS EndDate
FROM
TABLE A LEFT JOIN
TABLE B ON A.PKId = B.ParentPKId
WHERE
A.Status % 2 = 1
答案 2 :(得分:1)
试试这个......
CREATE TABLE #Scanning(StaffID INT, EventTime DATETIME, Status INT)
INSERT INTO #Scanning
VALUES
(1, '2016-06-24 07:30:00', 1)
,(1, '2016-06-24 13:00:00', 2)
,(1, '2016-06-24 14:00:00', 3)
,(1, '2016-06-24 17:00:00', 4)
,(1, '2016-06-25 07:30:00', 1)
,(1, '2016-06-25 13:00:00', 2)
,(1, '2016-06-25 14:00:00', 3)
,(1, '2016-06-25 17:00:00', 4)
SELECT s1.StaffID,
s1.EventTime AS StartDate,
s2.EventTime AS EndDate
FROM #Scanning s1
LEFT JOIN #Scanning s2 ON s1.StaffID = s2.StaffID
AND s2.Status = s1.Status + 1
AND CAST(s1.EventTime AS DATE) = CAST(s2.EventTime AS DATE) -- match for each day..
WHERE s1.Status%2 = 1 -- only rows with odd Numbers
答案 3 :(得分:1)
Select
*
From
(
Select staffid, eventtime, status from table
Where cast (status as float) % 2 =0
) as enters
Left outher join (
Select staaffid ,eventtime , statsus from table
Where cast (status as float) % 2 >0
) as exits on enters.staffid=exits.staffid and enters.status+1= exits.statsu