2012-09-03 5 views
1

지정된 값을 가진 행 앞에 2 행 ID를 가져 오려고합니다.여러 ID 앞에 행을 선택하십시오.

그래서 나는 오류 전에 두 행을 원하는 테이블

ID value 
1, x 
3, x 
7, x 
8, error 
9, x 
10. x 
11, x 
12 error 

에 ID와 값이 있습니다.

나는 SELECT id FROM thetable WHERE value = 'error' 또는 다른 방법으로이 조합으로, 예를 들어이 작업을 수행 할 수있는 방법, 하드 오류 행 ID

SELECT id FROM thetable WHERE id < 8 ORDER BY ID DESC LIMIT 2 
UNION ALL 
SELECT id FROM thetable WHERE id < 12 ORDER BY ID DESC LIMIT 2 

나는 오류 아이디의를 하드 코딩 할 수 Howewer

이 할 수 있습니까?

저는 sqlite 3을 사용하지만 모든 것에 관심이 있습니다.

+2

있었 이전 일곱 질문에 답변 없음 허용 당신을 위해 작동 여부를하지만 코드 아래에 시도? – Jodrell

+0

나는 썼다 : 이것은 sqlite3이다 –

+0

미안하다, 나는 대답을 받아들이는 것을 잊는다 (또는 didnt는 알고있다, 나는 이것을해야한다). 나는 그것을 지금한다! 고맙습니다! –

답변

3

나는 SQLite에 익숙하지 않기 때문에 구문에 대해 전혀 모른다. 이

select id,value 
from (select *,rowid rid from tbl 
order by id) 
where rid in 
(
    select rowid-1 from tbl 
    where value = 'error' 
    order by id 
)or rid in 
(
    select rowid-2 from tbl 
    where value = 'error' 
    order by id 
) 

DEMO

+0

@aldmike 그 문제는 무엇입니까 ?? 그 시나리오를 처리했는데 내 데모를 확인 했습니까 ?? – jaychapani

+0

당신의 데모는 괜찮 았는데, 나는 나의 코멘트를 삭제했다. 나는 이제 시간을내어 청혼을 통합하고 점검 할 필요가있다. 감사합니다. –

+0

@aldmike이 솔루션을 다른 사람이 참조 할 수 있도록 답변으로 표시하는 것이 좋을 경우 @aldmike를 입력하십시오. – jaychapani

0
select id, value 
from test where id in (select id-1 from test where value = 'error') 

오류 뒤에있는 첫 번째 ID를 항상 찾으면 작동합니다. ID를 건너 뛰면 MIN 함수를 사용하여 가장 가까운 기존 ID를 얻을 수 있습니다.

+0

불행히도 나는 MIN 함수로 어떻게 해결할 수 있을지 모른다. –

0

이 시도 : sqllite이 기능을 훨씬 쉽게 솔루션을 만들 것 이십 기가 바이트 랭킹 경우

SELECT id 
FROM thetable 
ORDER BY 
    CASE WHEN value = 'error' THEN value ELSE ID END 
DESC 
2

SQL Fiddle Demo


는 나도 몰라하지만 다음 문장은 어떤 ANSI-92에서 작동해야 호환 DBMS.

솔루션의 요점은

  • 1 단계 : 가져 오기 모든 error ID의
  • 2 단계 다음을 검색하기 위해 동일한 쿼리에 GROUP BY 절을 사용하여 가입하여 모든 ID의 < 루트 ID 년대를 가져옵니다 원래 오류 ID는
  • 입니다. 3 단계 : 2 단계와 비슷하지만 다른 단계로 내려갑니다.

SQL 문

SELECT ID 
FROM (
       -- Select the ROOT value 
       SELECT ID, 0 AS GroupID 
       FROM thetable 
       WHERE value = 'error' 
       UNION ALL 

       -- Selects the ROOT value - 1 
       SELECT MAX(t.ID) AS ID, te.ID AS GroupID 
       FROM thetable AS t 
         INNER JOIN (
         SELECT ID 
         FROM thetable 
         WHERE value = 'error' 
        ) AS te ON te.ID > t.ID 
       GROUP BY 
         te.ID 

       UNION ALL   

       -- Selects the ROOT value - 1 - 1 
       SELECT MAX(t.ID), te.ID 
       FROM thetable AS t 
         INNER JOIN (  
         SELECT MAX(t.ID) AS ID, te.ID AS GroupID 
         FROM thetable AS t 
           INNER JOIN (
            SELECT ID 
            FROM thetable 
            WHERE value = 'error' 
           ) AS te ON te.ID > t.ID 
         GROUP BY 
           te.ID 
        ) AS te ON te.ID > t.ID 
       GROUP BY 
         te.ID 
      ) AS t     

ORDER BY 
     ID 

편집

FWIW : 문을 수행하면 동일한 결과를 반환하지만 훨씬 더 응축, 기능 및 CTE의 순위 있도록 SQLite에해야한다.

;WITH q AS (
    SELECT ROW_NUMBER() OVER (ORDER BY ID) rn 
      , ID 
      , value 
    FROM thetable 
) 
SELECT q2.ID 
FROM q q1 
     INNER JOIN q q2 ON q2.rn BETWEEN q1.rn - 2 AND q1.rn 
WHERE q1.value = 'error' 
+0

조금 시간이 필요합니다 :) Thanks –

+0

ROW_NUMBER() 또는 sqlite에 등가가 없으면 두 번째는 사용할 수 없습니다. (내가 잘 읽었다면) 첫 번째 시도. –

+0

좋습니다. 첫 번째 방법은 통합 후 sqlite에도 좋습니다. 너무 거대하고 이해해야 만합니다. 감사합니다. 사용하겠습니다! –

관련 문제