我的数据如下:
Id| Em_Name|Em_Reg_Date
--------------------------------
1 | John |2010-03-30 00:00:00
1 | John |2010-03-31 00:00:00
2 | Marc |2010-10-26 00:00:00
2 | Marc |2010-10-27 00:00:00
2 | Marc |2010-10-28 00:00:00
2 | Marc |2010-10-29 00:00:00
2 | Marc |2010-12-16 00:00:00
2 | Marc |2010-12-17 00:00:00
2 | Marc |2010-12-20 00:00:00
2 | Marc |2010-12-21 00:00:00
2 | Marc |2010-12-22 00:00:00
3 | Paul |2010-02-25 00:00:00
3 | Paul |2010-02-26 00:00:00
3 | Paul |2010-12-13 00:00:00
3 | Paul |2010-12-14 00:00:00
3 | Paul |2010-12-15 00:00:00
--------------------------------
时间范围是连续的一段时间 例如保罗有两(2)个时间框架
FRAME 1 FROM 2010-02-25 00:00:00 to 2010-02-26 00:00:00
FRAME 2 FROM 2010-12-13 00:00:00 to 2010-12-15 00:00:00
所以,结果应该是这样的
1 John 1
2 Marc 3
3 Paul 2
问题是:我需要计算每个员工的时间范围。
这里的问题在于我需要隔离连续时间帧以便对它们进行计数。我甚至尝试了一个声明游标(但是我可以将数据存储在临时表中)并且我希望这是一个“简单”的sql语句 使用max查找开始日期仅适用于一帧。你找不到最大的第二/第三帧。
有没有人有新的想法?
答案 0 :(得分:2)
SQL Server 2005 +
select em_name, COUNT(distinct startdate)
from
(
select *, startdate = em_reg_date - ROW_NUMBER() over (
partition by em_name order by em_reg_date) +1
from tbl
) X
group by Em_Name
Oracle,DB2也支持Row_Number(),但是你需要一些变化来计算startdate
答案 1 :(得分:2)
我不确定ID和em_name字段的原因,所以我会将其视为ID足以单独使用。
我正在使用的逻辑就是这样......一个组可以由组中的最后一个条目表示。最后一个条目只是第二天没有匹配条目的条目。
如果(ID,Em_Reg_Date)的索引存在,这应该非常快。
SELECT
ID,
COUNT(*)
FROM
your_table [source]
WHERE
NOT EXISTS (
SELECT
*
FROM
your_table
WHERE
Em_Reg_Date = [source].Em_Reg_Date + 1
AND ID = [source].ID
)
GROUP BY
ID
修改强>
如果当前记录是星期五,星期六或星期日,这会将逻辑更改为“直到下一个星期一”。
SET DATEFIRST 1 -- This just ensures that Monday is counted as Day 1
SELECT
ID,
COUNT(*)
FROM
your_table [source]
WHERE
NOT EXISTS (
SELECT
*
FROM
your_table
WHERE
ID = [source].ID
AND Em_Reg_Date <= [source].Em_Reg_Date + CASE WHEN DATEPART(weekday, [source].Em_Reg_Date) >= 5 THEN 8 - DATEPART(weekday, [source].Em_Reg_Date) ELSE 1 END
AND Em_Reg_Date > [source].Em_Reg_Date
)
GROUP BY
ID
答案 2 :(得分:1)
SELECT Id, Name, COUNT( Id )
FROM (
SELECT Id, Name
FROM `<your_table_name>`
GROUP BY Name, MONTH( Em_Reg_Date )
) as X
GROUP BY Id
在MySQL 5.0.7上测试