2012-09-03 77 views
1

我想在具有指定值的行之前獲取2個行ID。在多個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 id < 8 ORDER BY ID DESC LIMIT 2 
UNION ALL 
SELECT id FROM thetable WHERE id < 12 ORDER BY ID DESC LIMIT 2 

Howewer我不能硬編碼錯誤ID的做到這一點,我怎麼能例如與SELECT id FROM thetable WHERE value = 'error'或任何其他方式結合該做到這一點?

我使用sqlite 3,但我對一切都感興趣。

+2

都沒有一個答案到以前的七個問題是否可以接受? – Jodrell

+0

我寫道:這是sqlite3 –

+0

對不起,我忘記接受答案(或不知道,我必須這樣做)。我現在就做!謝謝! –

回答

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如果您發現此解決方案可以將其標記爲答案,以便其他人可以參考它。 – 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

試試這個:

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

SQL Fiddle Demo


我不知道是否有sqllite排名函數至極將使解決方案輕鬆了許多,但下面的語句應該在任何ANSI-92工作兼容DBMS。

解決方案的要點是

  • 第一步:獲取所有error ID的
  • 第二步:使用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:應該允許SQLite的排名函數和CTE的,下面的語句返回相同的結果,但更多的冷凝。

;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

我需要一點時間:)謝謝 –

+0

我不能使用第二個,因爲在sqlite中沒有ROW_NUMBER()或equalent。 (如果我很好的閱讀),我會嘗試第一個 –

+0

好的,第一種方式也是在集成之後的sqlite上。只有一點點太巨大,我必須理解。 謝謝,我會用它! –