2014-09-30 2 views
0

У меня есть таблица, какПолучение подряд 5 отпуска из БД

staff_id | att_date  | status 

    1   2014-09-04  A 
    1   2014-09-05  P 
    1   2014-09-07  A 
    1   2014-09-08  A 
    1   2014-09-10  A 
    1   2014-09-11  A 
    1   2014-09-12  A   
    2   2014-09-04  P 
    3   2014-09-05  P 
    4   2014-09-06  P 
    2   2014-09-07  A 
    3   2014-09-08  P 

Я хочу, чтобы персонал, который взял продолжается 5 листьев. например, персонал 1 взял 5 листьев. Я пробовал этот запрос. Но это будет список, даже если персонал взял 5 листьев независимо от того, продолжает оставлять

SELECT staff_id,count(*) 
FROM my_table 
WHERE status = 'A' 
GROUP BY staff_id HAVING count(*)>4 
+0

У вас есть первичный ключ этой таблицы? – Mihai

+0

Да У меня есть первичный ключ на этой таблице – Shafeeque

ответ

1

Вы можете использовать ранг запрос с определенным пользователем переменные для присвоения одного ранга для каждого повторного статуса в группе staff_id, а во внешнем запросе просто проверьте счет

select staff_id,status,row_num 
from (
select *, 
@r:= case when @g = staff_id 
    then 
     case when @s <> `status` then @r + 1 else @r end 
     else @r + 1 
     end row_num, 
@g:= staff_id, 
@s:= status 
from my_table m 
cross join(select @g:=null,@r:=0,@s:=null) t 
order by staff_id,att_date,status 
) t1 
where status = 'A' 
group by staff_id 
having count(*) >= 5 

Demo

Another demo with changed data

Edit для последовательных дней

select staff_id,status,row_num 
from (
select *, 
@r:= case when @g = staff_id 
    then 
     case when @s <> `status` then @r + 1 else @r end 
     else @r + 1 
     end row_num, 
@g:= staff_id, 
@s:= status 
from my_table m 
cross join(select @g:=null,@r:=0,@s:=null) t 
where 
    case when @d is null then 1 else 
    DATEDIFF(att_date, @d) = 1 
    end 
order by staff_id,att_date,status 
) t1 
where status = 'A' 
group by staff_id 
having count(*) >= 5 

Demo for old data set

Demo for updated data set

+0

Спасибо за ваш ответ, но он не работает должным образом. измените 3-й статус на P и подсчитайте (*)> = 4. Он не принимает дату продолжения – Shafeeque

+0

@Shafeeq да этот запрос будет искать непрерывный статус A он не будет работать в течение непрерывных дат –

+0

@Shafeeq также в моем состоянии ответа '> = 5' not 4 [' See demo'] (http://sqlfiddle.com/#!2/231937/1) –

0

Вам нужно еще одну переменных для подсчета дней подряда

SELECT staffid ,status FROM 
(SELECT staffid,status, 
    CASE WHEN [email protected]_ci+INTERVAL 1 DAY THEN @n ELSE @n:[email protected]+1 END AS g, 
    @last_ci := att_date As att_date 
    FROM 
    t, (SELECT @n:=0) r 
ORDER BY staffid,att_date)x 
GROUP BY 
staffid,g 
HAVING SUM(status='A')>4 
AND COUNT(DISTINCT g)=1 

FIDDLE

+0

Im немного путают о поле att_date ?? Можете ли вы уточнить свой ответ – Shafeeque

+0

, что он не работает должным образом. Я обновил свой вопрос – Shafeeque