Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
显示3行或更多连续行(Sql)_Sql_Oracle_Oracle11g - Fatal编程技术网

显示3行或更多连续行(Sql)

显示3行或更多连续行(Sql),sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有一张表,上面有以下数据 +------+------------+-----------+ | id | date1 | people | +------+------------+-----------+ | 1 | 2017-01-01 | 10 | | 2 | 2017-01-02 | 109 | | 3 | 2017-01-03 | 150 | | 4 | 2017-01-04 | 99

我有一张表,上面有以下数据

+------+------------+-----------+
| id   | date1      | people    |
+------+------------+-----------+
| 1    | 2017-01-01 | 10        |
| 2    | 2017-01-02 | 109       |
| 3    | 2017-01-03 | 150       |
| 4    | 2017-01-04 | 99        |
| 5    | 2017-01-05 | 145       |
| 6    | 2017-01-06 | 1455      |
| 7    | 2017-01-07 | 199       |
| 8    | 2017-01-08 | 188       |
+------+------------+-----------+

现在我要做的是显示3个连续的行,其中的人>=100,如下所示

+------+------------+-----------+
| id   | date1      | people    |
+------+------------+-----------+
| 5    | 2017-01-05 | 145       |
| 6    | 2017-01-06 | 1455      |
| 7    | 2017-01-07 | 199       |
| 8    | 2017-01-08 | 188       |
+------+------------+-----------+
SELECT id, date1, people FROM stadium a WHERE people >= 100
    AND (SELECT people FROM stadium b WHERE b.id = a.id + 1) >= 100
    AND (SELECT people FROM stadium c WHERE c.id = a.id + 2) >= 100 
    OR people >= 100
            AND (SELECT people FROM stadium e WHERE e.id = a.id - 1) >= 100
            AND (SELECT people FROM stadium f WHERE f.id = a.id + 1) >= 100
    OR people >= 100
            AND (SELECT people FROM stadium g WHERE g.id = a.id - 1) >= 100
        AND (SELECT people FROM stadium h WHERE h.id = a.id - 2) >= 100
order by id;
谁能帮助我如何使用oracle数据库进行此查询。我能够显示大于100的行,但不能连续显示

表格创建减少将提供帮助的人的打字时间

CREATE TABLE stadium
   ( id int  
   , date1 date, people int 
   );

    Insert into stadium values (    
 1,TO_DATE('2017-01-01','YYYY-MM-DD'),10);

Insert into stadium values       
 (2,TO_DATE('2017-01-02','YYYY-MM-DD'),109);

Insert into stadium values(       
 3,TO_DATE('2017-01-03','YYYY-MM-DD'),150);

Insert into stadium values(       
 4,TO_DATE('2017-01-04','YYYY-MM-DD'),99);

Insert into stadium values(     
 5,TO_DATE('2017-01-05','YYYY-MM-DD'),145);

Insert into stadium values(  
 6,TO_DATE('2017-01-06','YYYY-MM-DD'),1455);

Insert into stadium values
(7,TO_DATE('2017-01-07','YYYY-MM-DD'),199);

Insert into stadium values(
 8,TO_DATE('2017-01-08','YYYY-MM-DD'),188);

提前感谢您的帮助

假设您的意思是>=100,有几种方法。一种方法只使用超前和滞后。但是,一个简单的方法通过前面<100的值的数量来定义每个组>=100。然后使用count*查找连续值的大小:

select s.*
from (select s.*, count(*) over (partition by grp) as num100pl
      from (select s.*,
                   sum(case when people < 100 then 1 else 0 end) over (order by date) as grp
            from stadium s
           ) s
     ) s
where num100pl >= 3;

是显示语法工作的SQL FIDLE。

我假设id和日期列都是连续的,并且彼此对应。如果id与日期不连续,则需要额外的行号,如果日期不一定连续,则需要包含更复杂的逻辑

SELECT 
    *

FROM 
    (
        SELECT
            *
            ,COUNT(date) OVER (PARTITION BY sequential_group_num) AS num_days_in_sequence

        FROM 
            (
                SELECT
                    *
                    ,(id - ROW_NUMBER() OVER (ORDER BY date)) AS sequential_group_num

                FROM
                    stadium

                WHERE 
                    people >= 100

            ) AS subquery1

    ) AS subquery2

WHERE 
    num_days_in_sequence >= 3
将生成以下输出:

id          date       people      sequential_group_num num_days_in_sequence
----------- ---------- ----------- -------------------- --------------------
5           2017-01-05 145         2                    4
6           2017-01-06 1455        2                    4
7           2017-01-07 199         2                    4
8           2017-01-08 188         2                    4

通过使用连接,我们可以像这样显示连续的行

+------+------------+-----------+
| id   | date1      | people    |
+------+------------+-----------+
| 5    | 2017-01-05 | 145       |
| 6    | 2017-01-06 | 1455      |
| 7    | 2017-01-07 | 199       |
| 8    | 2017-01-08 | 188       |
+------+------------+-----------+
SELECT id, date1, people FROM stadium a WHERE people >= 100
    AND (SELECT people FROM stadium b WHERE b.id = a.id + 1) >= 100
    AND (SELECT people FROM stadium c WHERE c.id = a.id + 2) >= 100 
    OR people >= 100
            AND (SELECT people FROM stadium e WHERE e.id = a.id - 1) >= 100
            AND (SELECT people FROM stadium f WHERE f.id = a.id + 1) >= 100
    OR people >= 100
            AND (SELECT people FROM stadium g WHERE g.id = a.id - 1) >= 100
        AND (SELECT people FROM stadium h WHERE h.id = a.id - 2) >= 100
order by id;
SQL脚本:

SELECT DISTINCT SS.*
FROM STADIUM SS
INNER JOIN 
(SELECT S1.ID
    FROM STADIUM S1
    WHERE 3 = (
    SELECT COUNT(1)
    FROM STADIUM S2
    WHERE (S2.ID=S1.ID OR S2.ID=S1.ID+1 OR S2.ID=S1.ID+2)
    AND S2.PEOPLE >= 100
    )) AS SS2
    ON SS.ID>=SS2.ID AND SS.ID<SS2.ID+3

我正在尝试做的是显示3个连续的行,其中有人也在,请显示您的查询哪个工作。1您需要指定您正在使用的数据库:SQL Server?我的SQL?神谕等2得到正确的条件,是否等于100?3使用正确的数据类型,而不是numberx,例如date或datetime和int。我正在使用oracle databaseapexthanks寻求帮助,但我得到了这个错误--ORA-00936:缺少表达式您可以使用lead和lag发布相同的查询吗?虽然这段代码可以解决这个问题,如何以及为什么解决这个问题将真正有助于提高您的帖子质量,并可能导致更多的投票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请在回答中添加解释,并说明适用的限制和假设。