不知道這是否是最佳實現它的方式,但它的工作原理。我創建了下面的表格把你的示例數據爲:
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是上一行中的項目標識,LAST_ITEM_ID是之前2行中的項目標識。
在WHERE子句中,我確保ITEM_ID匹配前兩個ITEM_ID並且RESULT_COL匹配前兩個RESULT_COL。我也確保最後兩個日期是連續的。
連續3次基於什麼?日期和結果組合?有沒有關鍵的專欄? – NMK 2014-09-30 09:02:09
感謝您的幫助。 我想過濾具有特定結果的項目,讓我們連續說'A'。因此,如果項目1有結果A,那麼B然後是A,然後是A,它不會被包括在內。只有它有A,然後A又一次A.日期可以是任何時間,它們不是每天或每週或每月。只有序列是重要的。 我希望我現在解釋得夠好。沒有關鍵列。 – 2014-09-30 12:03:32