2016-02-08 34 views
1

第一選擇我要尋找一個SQL查詢來尋找以下:SQL查詢從指數

index A B 
1 5 1 
2 10 1 
3 15 0 
4 10 0 
5 20 1 
6 5 0 
7 15 1 
8 25 0 
9 20 0 
10 15 0 

選擇「項」列其中B爲1,查找第一個下一行從該點向下時, 「退出」行,其中A是條目A值+10或更多,或者-10或更多,與「退出」行中B的值無關。返回入口索引,退出索引,以及一些指標,如果出口是+10或-10,那麼很好,如果不可能的話,nwm。所以在這種情況下,查詢的輸出應該使用子查詢是

entryindex exitindex +10/-10 
1 3 +10 //entry in line 1, because B is 1, exit on line 15, because 15 is 5 +10 
2 5 +10 
5 6 -10 
7 8 -10 
+0

我認爲預期結果的最後一行是錯誤的。 –

+0

是的,更正了,謝謝 – user3338991

回答

1

快速嘗試: -

SELECT t1.index AS entryindex, 
     t2.index AS exitindex, 
     IF(t1.A <= t2.A, '+10', '-10') AS '+10/-10' 
FROM 
(
    SELECT t1.index AS t1_index, 
      MIN(t2.index) AS t2_index 
    FROM a_table t1 
    INNER JOIN a_table t2 
    ON t1.index < t2.index 
    AND (t1.A <= t2.A - 10 
    OR t1.A >= t2.A - 10) 
    WHERE t1.B = 1 
    GROUP BY t2.index 
) sub0 
INNER JOIN a_table t1 
ON t1.index = sub0.t1_index 
INNER JOIN a_table t2 
ON t2.index = sub0.t2_index 
1

您可以使用相關子查詢得到預期的結果:

SELECT entryindex, exitindex, IF(entryA < exitA, '+10', '-10') 
FROM (
    SELECT t1.`index` AS entryindex, 
     (SELECT t2.`index` 
      FROM mytable AS t2 
      WHERE t2.`index` > t1.`index` AND 
       ((t2.`A` >= t1.`A` + 10) OR (t2.`A` <= t1.`A` - 10)) 
      ORDER BY `index` LIMIT 1) AS exitindex, 
      t1.`A` AS entryA, 
     (SELECT t2.`A` 
      FROM mytable AS t2 
      WHERE t2.`index` > t1.`index` AND 
       ((t2.`A` >= t1.`A` + 10) OR (t2.`A` <= t1.`A` - 10)) 
      ORDER BY `index` LIMIT 1) AS exitA   
    FROM mytable AS t1 
    WHERE t1.`B` = 1) AS t 
ORDER BY entryindex 

Demo here