2014-01-30 2 views
0

예제 테이블 이름 "Person"을 고려하십시오. 위의 표에 SQL을 사용하여 열의 값 시퀀스가있는 행을 찾는 방법은 무엇입니까?

Name |Date |Work_Hours 
--------------------------- 
John| 22/1/13  |0 
John| 23/1/13  |0 
Joseph| 22/1/13  |1 
Joseph| 23/1/13  |1 
Johnny| 22/1/13  |0 
Johnny| 23/1/13  |0 
Jim| 22/1/13  |1 
Jim| 23/1/13  |0 

, 내가 열 Work_Hours에서 '1'다음 '0'의 순서로 행을 찾을 수있다. 아이디어/Query를 공유하십시오.

내가 필요로하는 출력은

Name |Date |Work_Hours 
--------------------------- 
John| 23/1/13  |0 
Joseph| 22/1/13  |1 
Johnny| 23/1/13  |0 
Jim| 22/1/13  |1 
+1

이 행으로 주문해야합니다

이에게 상관 하위 쿼리를 수행 할 수 있습니다 날짜? – carexcer

+0

@carexcer'group by name, date' 사용 – Melon

+0

값이 0이고 다음 줄 (첫 번째 조셉 라인)의 값이 1이기 때문에 두 번째 존 라인을 찾고 있습니까? 그리고 첫번째 Jim 선 때문에 두번째 쟈니 선을 위해? 정렬 순서는 무엇입니까? 나는 아무 것도 볼 수 없다. –

답변

0

당신이 일반적으로 집계 함수가 LAG 사용하는 것이, 이전 또는 다음과 같은 기록을 조사하고 LEAD :

select first_name, work_date, work_hours 
from 
(
    select first_name, work_date, work_hours 
    , lag(work_hours) over (order by first_name, work_date) as prev_work_hours 
    , lead(work_hours) over (order by first_name, work_date) as next_work_hours 
    from person 
) 
where (work_hours = 0 and next_work_hours = 1) or (work_hours = 1 and prev_work_hours = 0) 
order by first_name, work_date; 
+0

@Kettner 감사합니다. 이제 제대로 작동합니다. –

0

select no_hours.Name, no_hours.Date, some_hours.Date 
From Person no_hours 
inner join Person some_hours 
On no_hours.Name = some_hours.name and some_hours.Date > no_hours.date 
Where no_hours.work_hours = 0 and some_hours.work_hours = 1 

같은 일부 일이 시작이 될 것입니다.

, 이름이 좋은 고유 식별자하지 않습니다 말할 필요도없이 ...

또한 시간이 많이 나타납니다 0 1 1 0을 나타납니다 1 0 0에서 진행하고, 작동 ...

당일 0 시부 터 1 시까지는> = no_hours.date가됩니다. 아마도

0

하십시오 name에 대한 0 주어진 행을 따르는 1 있습니까 :

SELECT p1.Name, 
     p1.Date AS Date_1, 
     p2.Date AS Date_2, 
     p1.Work_Hours As Work_Hours_1, 
     p2.Work_Hours As Work_Hours_2 
FROM Person p1 
INNER JOIN Person p2 
    on p1.Name=p2.Name 
    AND p1.Work_Hours=0 
    AND p2.Work_Hours=1 
ORDER BY p1.Name,p1.Date,p2.Date,Work_Hours_1,Work_Hours_2 

Demo

0

귀하의 문제 (말로 표현으로는) 요청에 해당?

select Name, Date, Work_Hours 
from (select t.*, 
      (select min(date) 
       from table t2 
       where t2.name = t.name and t2.date > t.date and t2.Work_Hours = 1 
      ) as DateOfLater1 
     from table t 
    ) t 
where DateOfLater1 is not null and work_hours = 0 or 
     (DateOfLater1 = date and work_hours = 1); 
+0

문제를 다시 쓰는 것이 올바르지 않습니다. 이 질문은 "... 0의 시퀀스가있는 행을 찾으려면 1"을 변경하고 "... ... 0 또는 1의 순서로 행을 찾아서 1을 찾습니다." – Tony

+0

@ 토니. . . 나는 그것을 받아 들인다. 그러나 나는 여전히 '1'이 포함 된 행이 포함되어야하는지 여부를 질문 할 수 없다. –

관련 문제