当有6个月的差距时,如果没有6个月的差距,则应抓住所有内容,然后用sql

时间:2019-03-11 14:29:49

标签: sql sql-server

我正在处理查询请求,需要一些帮助。

我试图找出一个案例,当陈述存在6个月的间隔时,然后获取下一个数字;当陈述没有6个月的间隔时,然后获取所有这些。

示例1

ID Gap 
1   0
2   4
3   1
4   8
5   1
6   6
7   1

因此,在此示例中,有一个8的缺口,所以如果这是唯一的缺口> = 6,那么我将抓住那个缺口,但是由于还有另一个6的缺口,我只想获取ID 7。

示例2:

ID  Gap 
1   0
2    1
3    0
4    2
5    0

因此,在此示例中,没有间隙。所以我想获取所有这些ID。

这一切都在sql中

enter image description here

2 个答案:

答案 0 :(得分:3)

好吧,您可以使用窗口功能:

select id, gap
from (select t.*,
             max(case when gap >= 6 then id end) over (order by id) as id_6
      from t
     ) t
where id > id_6 or id_6 is null;

答案 1 :(得分:0)

使用光标,未在SSMS上进行测试。这是另一种方法,不是最好的方法,但这是我的个人训练。

IF EXISTS (SELECT * FROM table WHERE Gap >= 6)
BEGIN
    DECLARE @id AS INT;
    DECLARE @gap AS INT;
    DECLARE @id2 AS INT;
    DECLARE @gap2 AS INT;

    DECLARE gap_cursor CURSOR FOR   
        SELECT ID, Gap
        FROM table;

    OPEN gap_cursor;
    FETCH NEXT FROM gap_cursor INTO @id, @gap;

    WHILE @@FETCH_STATUS = 0  
    BEGIN 
        IF (@gap >= 6)
        BEGIN
            FETCH NEXT FROM gap_cursor   
            INTO @id, @gap;
            SET @id2 = @id;
            SET @gap2 = @gap;
        END

        ELSE
        BEGIN
            FETCH NEXT FROM gap_cursor INTO @id, @gap;
        END
    END
    SELECT @id2, @gap2;
END
ELSE
BEGIN
    SELECT *
    FROM table;
END