SQL - 如何选择特定的行及其最近的邻居?

时间:2017-11-28 08:55:01

标签: mysql sql

我有一张表,我可以按时间排序,例如。现在我想根据时间选择我的数据,例如在一行中使用column_x = something和该行的一些最近邻居(预先给出的具体数字)。在请求中我想选择多行。让我举一个简单的例子说明:

+------+----------+----------+
| Time | Column_1 | Column_2 |
+------+----------+----------+
|    1 |        0 |        5 |
|    2 |        0 |        6 |
|    3 |        1 |        9 |
|    4 |        1 |        8 |
|    5 |        0 |        5 |
|    6 |        0 |        8 |
|    7 |        0 |        9 |
|    8 |        0 |        6 |
|    9 |        0 |        4 |
|   10 |        1 |        5 |
|   11 |        0 |        2 |
|   12 |        0 |        3 |
|   13 |        0 |        1 |
+------+----------+----------+

我想选择结果数据,使得COLUMN_1 = 1,并且两个最接近的邻居及时。所以我期待的结果就是这张表:

+------+----------+----------+
| Time | Column_1 | Column_2 |
+------+----------+----------+
|    1 |        0 |        5 |
|    2 |        0 |        6 |
|    3 |        1 |        9 |
|    4 |        1 |        8 |
|    5 |        0 |        5 |
|    6 |        0 |        8 |
|    8 |        0 |        6 |
|    9 |        0 |        4 |
|   10 |        1 |        5 |
|   11 |        0 |        2 |
|   12 |        0 |        3 |
+------+----------+----------+

1 个答案:

答案 0 :(得分:1)

一个解决方案可能是这个,我不知道t是否是最好的一个:

select
    time
    ,col_1
    ,col_2
from @tbl
where col_1 = 1
union
select
    t2.time
    ,t2.col_1
    ,t2.col_2
from  @tbl t1
inner join @tbl t2
    on t1.time = t2.time-1
    or t1.time = t2.time-2
where t1.col_1 = 1
union
select
    t2.time
    ,t2.col_1
    ,t2.col_2
from  @tbl t1
inner join @tbl t2
    on t1.time = t2.time+1
    or t1.time = t2.time+2
where t1.col_1 = 1