【问题标题】:SQL query select first from indexSQL查询先从索引中选择
【发布时间】:2016-02-08 12:13:47
【问题描述】:

我正在寻找一个 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

【问题讨论】:

  • 我认为预期结果的最后一行是错误的。
  • 是的,已更正,谢谢

标签: mysql select indexing


【解决方案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

【讨论】:

    【解决方案2】:

    您可以使用相关子查询来获得预期结果:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多