对于数据库人来说这可能是一个愚蠢的问题,但对我来说这非常艰难,因为这是我第一次看到DATABASE ..我不是DATABASE人,但我必须这样做。
我在SQL SERVER 2005中有DATABASE,并且有一个VIEW包含与员工进/出办公室相关的数据。
特定日期一天可能有超过2个条目,但我们认为一天中的第一个条目是在办公室中的最后一个条目,最后一个条目是从办公室出来的时间,在这些之间这些员工可以出去没有时间,但我们只考虑一天中的第一次和最后一次。
所以我必须为此写下QUERY ......
编辑:
视图中的coloumns列表中还有其他一些coloumn,但我认为没有必要在这里描述..
答案 0 :(得分:1)
尝试一个好的'group by
.
Select employeeID, Date,
MIN(Time) as InTime,
MAX(Time) as OutTime
FROM Transactions
GROUP BY employeeID, Date
答案 1 :(得分:0)
您可以使用ROW_NUMBER()排名功能来确定第一次和最后一次条目
;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 = 1
上的简单示例
或者使用EXISTS运算符选项
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]))
)
上的简单示例
答案 2 :(得分:0)
现在我正在使用该查询:
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
它给出了完美的结果............