这对数据库人员来说可能是个愚蠢的问题,但对我来说,这是非常困难的,因为这是我第一次看到数据库,我不是数据库的人,但我必须这样做。
我在SQL SERVER 2005中有数据库,并且有一个视图包含与office中的雇员入/出相关的数据。

在某一特定日期,一天可能有两个以上的条目,但我们认为,一天中的第一个条目是在办公室的时间,最后一个条目是办公室的结束时间,在这些员工之间,这些员工可以在任何时间内外出,但我们只考虑一天中的第一次和最后一次。
所以我得为这个写个查询。
编辑:
图中的颜色列表中也有其他颜色,但我不认为有必要在这里描述。
发布于 2013-03-01 05:17:18
现在我使用这个查询:
SELECT FirstName,LastName,CardNumber,Department, Date , MIN(Time) AS intime , MAX(Time) AS outtime ,
convert(varchar(8),(convert(datetime,MAX(Time),110) - convert(datetime,MIN(Time),110)),108) AS Duration
FROM CARDENTRYEXITTRANSACTIONVIEW
GROUP BY FirstName, Date,LastName,CardNumber,Department并给出完美的结果.
发布于 2013-02-27 06:59:30
试试好的ol‘。
Select employeeID, Date,
MIN(Time) as InTime,
MAX(Time) as OutTime
FROM Transactions
GROUP BY employeeID, Date发布于 2013-02-27 07:39:13
您可以使用编号()排名函数来确定第一次和最后一次输入。
;WITH cte AS
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY PersonalID ORDER BY [Date] ASC, [Time] ASC) AS rnASC,
ROW_NUMBER() OVER(PARTITION BY PersonalID ORDER BY [Date] DESC, [Time] DESC) AS rnDESC
FROM dbo.your_tableName
)
SELECT *
FROM cte
WHERE rnASC = 1 OR rnDESC = 1SQLFiddle上的简单示例
或与存在性运算符一起使用选项
SELECT *
FROM dbo.your_tableName t1
WHERE EXISTS (
SELECT 1
FROM dbo.your_tableName t2
WHERE t1.PersonalID = t2.PersonalID
HAVING (t1.[Date] = MAX(t2.[Date]) AND t1.[Time] = MAX(t2.[Time]))
OR (t1.[Date] = MIN(t2.[Date]) AND t1.[Time] = MIN(t2.[Time]))
)SQLFiddle上的简单示例
https://stackoverflow.com/questions/15105954
复制相似问题