Sql查询以查找具有n个连续失败尝试的项
我只找到了一些稍有不同的例子,因为我的sql技能非常有限,无法适应我的需要 我有一个包含3个相关列的表: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
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()似乎是正确的方法。我看看能不能把这句话的意思提取出来。非常感谢!