2014-10-27 60 views
1

对不起,我想不出一个更好的标题。选择最小,最大和一行有一个特殊的FK

我有一个表是这样的:

... 
DATE (datetime) 
PROJECT (number - this is a FK to projects table) 
FROM (datetime) 
TO (datetime) 
... 

,我需要选择最低FROM值的每一天(如时间一天的工作开始了),最大的价值(为S的工作时间一天结束)和从和为标记为“BREAK”一个项目,所以输出会是这样的:

date  from to  break from break to time spent 
1.1.2011 9:00 17:00 12:00  13:00 7.0 

这在某种程度上可能的一个选择呢?到目前为止,我有这样的:

SELECT 
    MIN("FROM_X") AS "FROM", 
    MAX("TO_X") AS "TO", 
    (MAX("TO_X") - MIN("FROM_X"))*24 AS TIME_SPENT, 
    "DAY" 
FROM ATTENDANCE_HOURS 
GROUP BY DAY 

它需要开始和一天的工作结束的照顾,但我不知道如何具有断线的事情。

+0

您的attendance_hours表的PK和可能英国是什么?是日期(这将是一个糟糕的选择)或日期?为什么需要在一天中进行分组/为什么在attendance_hours每天有多个记录 - 他们是否是每个项目?我不完全了解这些项目是如何实现的? – Tom 2014-10-28 07:56:40

+0

PK是一个数字“ID”。我没有提及它,它似乎不相关。是的,该列名为DAY。那么,它代表了员工在项目上花费的时间 - 所以,每个记录都代表在一天内花费在一个项目上的X小时。从那以后,我需要提取每个人何时开始和离开工作,以及什么时候他有休息时间(也表示为一个项目)。 – Lea 2014-10-29 09:33:45

回答

2

如果“破发”的项目,每天只出现一次,你可以使用:

SELECT 
    MIN("FROM_X") AS "FROM", 
    MAX("TO_X") AS "TO", 
    max(case when project = 'break' then from_x else null end) as "BREAK FROM", 
    max(case when project = 'break' then to_x else null end) as "BREAK TO", 
    (MAX("TO_X") - MIN("FROM_X"))*24 AS TIME_SPENT, 
    "DAY" 
FROM ATTENDANCE_HOURS 
GROUP BY DAY 

如果没有,您需要选择适当的聚合功能。您也可以使用此解决方案从前两列中排除您的“休息”项目:

SELECT 
    max(case when project <> 'break' then from_x else null end) as "FROM", 
    max(case when project <> 'break' then to_x else null end) as "TO", 
+0

正是我需要和拯救我的一天,我可以给你我的长子吗? – Lea 2014-10-29 09:53:59

相关问题