Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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
Sql查询以查找具有n个连续失败尝试的项_Sql_Oracle_Find Occurrences - Fatal编程技术网

Sql查询以查找具有n个连续失败尝试的项

Sql查询以查找具有n个连续失败尝试的项,sql,oracle,find-occurrences,Sql,Oracle,Find Occurrences,我只找到了一些稍有不同的例子,因为我的sql技能非常有限,无法适应我的需要 我有一个包含3个相关列的表: ItemID Date Result 1 1.2.2014 A 5 6.4.2014 B 9 7.4.2014 A 1 8.4.2014 A 1 9.4.2014 A 1 10.4.2014 A 我想连续3次找到具有特定结果(比如a)的项目。在上面的示例中,它将是项目1。这些日期通常不是连续的 S

我只找到了一些稍有不同的例子,因为我的sql技能非常有限,无法适应我的需要

我有一个包含3个相关列的表:

ItemID  Date      Result
1       1.2.2014  A
5       6.4.2014  B
9       7.4.2014  A
1       8.4.2014  A
1       9.4.2014  A
1       10.4.2014 A
我想连续3次找到具有特定结果(比如a)的项目。在上面的示例中,它将是项目1。这些日期通常不是连续的

SQL> WITH DATA AS(
  2  SELECT 1 ITEM_ID, TO_DATE('1.2.2014','DD.MM.YYYY') DT, 'A' RSLT FROM DUAL UNION ALL
  3  SELECT 5,       TO_DATE('6.4.2014','DD.MM.YYYY')  , 'B' RSLT FROM DUAL UNION ALL
  4  SELECT 9,       TO_DATE('7.4.2014','DD.MM.YYYY')  , 'A' RSLT FROM DUAL UNION ALL
  5  SELECT 1,       TO_DATE('8.4.2014','DD.MM.YYYY')  , 'A' RSLT FROM DUAL UNION ALL
  6  SELECT 1,       TO_DATE('9.4.2014','DD.MM.YYYY')  , 'A' RSLT FROM DUAL UNION ALL
  7  SELECT 1,       TO_DATE('10.4.2014','DD.MM.YYYY') , 'A' RSLT FROM DUAL)
  8  SELECT ITEM_ID FROM(
  9  SELECT A.*, ROW_NUMBER() OVER(PARTITION BY ITEM_ID ORDER BY RSLT) RN
 10  FROM DATA A)
 11  WHERE RN =3
 12  /

   ITEM_ID
----------
         1

SQL>
它应该在Oracle SQL中工作

非常感谢你的帮助

不确定这是否是实现这一目标的最佳方式,但它确实有效。我创建了下表以将示例数据放入:

CREATE TABLE DATE_RESULT(
  ITEM_ID INT,
  DATE_COL DATE,
  RESULT_COL VARCHAR2(255 CHAR)
);
然后运行此查询:

SELECT ITEM_ID FROM(
  SELECT
    ITEM_ID,
    TO_CHAR(DATE_COL,'DD-MON-YYYY') AS DATE_COL,
    RESULT_COL,
    LAG(ITEM_ID,1,NULL) OVER (ORDER BY ITEM_ID ASC, DATE_COL ASC) AS LAST_ITEM_ID,
    LAG(ITEM_ID,2,NULL) OVER (ORDER BY ITEM_ID ASC, DATE_COL ASC) AS LAST_ITEM_ID2,
    LAG(TO_CHAR(DATE_COL,'DD-MON-YYYY'),1,NULL) OVER (ORDER BY ITEM_ID ASC, DATE_COL ASC) AS LAST_DATE,
    LAG(TO_CHAR(DATE_COL,'DD-MON-YYYY'),2,NULL) OVER (ORDER BY ITEM_ID ASC, DATE_COL ASC) AS LAST_DATE2,
    LAG(RESULT_COL,1,NULL) OVER (ORDER BY ITEM_ID ASC, DATE_COL ASC) AS LAST_RESULT,
    LAG(RESULT_COL,2,NULL) OVER (ORDER BY ITEM_ID ASC, DATE_COL ASC) AS LAST_RESULT2
  FROM 
    DATE_RESULT
)
WHERE 
  ITEM_ID = LAST_ITEM_ID
  AND ITEM_ID = LAST_ITEM_ID2
  AND TO_DATE(DATE_COL)-1 = TO_DATE(LAST_DATE)
  AND TO_DATE(DATE_COL)-2 = TO_DATE(LAST_DATE2)
  AND RESULT_COL = LAST_RESULT
  AND RESULT_COL = LAST_RESULT2;
查询使用Oracle的LAG()函数从前面的行中获取值。因此,在本例中,LAST_ITEM_ID是前一行的项目ID,LAST_ITEM_ID是前两行的项目ID


在WHERE子句中,我确保ITEM_ID与前两个ITEM_ID匹配,RESULT_COL与前两个RESULT_COL匹配。我还要确保最后两个日期是连续的。

多亏了用户1578653,我才算出来。也许有一种更优雅的方法可以做到这一点,但它在几秒钟内就创造了大约500000条记录:

SQL> WITH DATA AS(
  2  SELECT 1 ITEM_ID, TO_DATE('1.2.2014','DD.MM.YYYY') DT, 'A' RSLT FROM DUAL UNION ALL
  3  SELECT 5,       TO_DATE('6.4.2014','DD.MM.YYYY')  , 'B' RSLT FROM DUAL UNION ALL
  4  SELECT 9,       TO_DATE('7.4.2014','DD.MM.YYYY')  , 'A' RSLT FROM DUAL UNION ALL
  5  SELECT 1,       TO_DATE('8.4.2014','DD.MM.YYYY')  , 'A' RSLT FROM DUAL UNION ALL
  6  SELECT 1,       TO_DATE('9.4.2014','DD.MM.YYYY')  , 'A' RSLT FROM DUAL UNION ALL
  7  SELECT 1,       TO_DATE('10.4.2014','DD.MM.YYYY') , 'A' RSLT FROM DUAL)
  8  SELECT ITEM_ID FROM(
  9  SELECT A.*, ROW_NUMBER() OVER(PARTITION BY ITEM_ID ORDER BY RSLT) RN
 10  FROM DATA A)
 11  WHERE RN =3
 12  /

   ITEM_ID
----------
         1

SQL>
SELECT ITEM_ID FROM(
   SELECT ITEM_ID, DATECOL, RESULT,
     LAG(ITEM_ID,1,NULL) OVER (ORDER BY ITEM_ID ASC, DATECOL ASC) AS LASTITEM,
     LAG(ITEM_ID,2,NULL) OVER (ORDER BY ITEM_ID ASC, DATECOL ASC) AS LASTITEM2,
     LAG(RESULT,1,NULL) OVER (ORDER BY ITEM_ID ASC, DATECOL ASC) AS LASTCODE,
     LAG(RESULT,2,NULL) OVER (ORDER BY ITEM_ID ASC, DATECOL ASC) AS LASTCODE2
   FROM
     RESULTTABLE
   )
WHERE
   ITEM_ID = LASTITEM
   AND ITEM_ID = LASTITEM2
   AND RESULT = 'A'
   AND RESULT = LASTCODE
   AND RESULT = LASTCODE2;
我在寻找在本例中连续出现3次的“a”的结果


我很高兴,谢谢

连续3次基于什么?日期和结果组合?有什么重要的专栏吗?谢谢你的帮助。我想过滤具有特定结果的项目,比如说在时间上连续地说“a”。因此,如果第1项的结果是A、B、A、A,则不包括在内。只有当它有一个,然后是一个,再次是一个。日期可以是任何时候,他们不是每天或每周或每月。只有顺序才重要。我希望我现在解释得足够好。没有关键栏。很抱歉没有很好地描述我想做的事情。这已经很接近了。但我在寻找有一个特殊结果的项目,比如说连续出现3次的“x”。日期可以是任何时间,其间只需有“x”以外的事件。Lag()似乎是正确的方法。我看看能不能把这句话的意思提取出来。非常感谢!