2015-12-22 58 views
0

oracle中的表中應該存在兩條記錄,一條來自請求,另一條來自響應。 oracle選擇今天的記錄但排除了前幾天可能存在的記錄

我想從今天選擇所有這些記錄,但問題是其他對可能存在於前兩天或更多。 我如何確保將要返回的記錄只有1和前幾天

select A.referenceNum, A.datetime, A.Type from table A where A.datetime >= sysdate - 1

將不存在可視化,我想只選擇參考NUM 789ef

  ReferenceNum日期時間     類型

  123ab                (datetoday)   請求

  123ab                (datetoday)   響應

  456cd                (datetoday)   請求

  456cd                (datetoday-2)   響應

789ef                  (datetoday)   請求

+1

如果ReferenceNum是連續的,您只需要從表A中選擇max(A.referenceNum),A.datetime,A.Type,其中A.datetime> = sysdate-1 group by A.datetime'。如果記錄太多,性能可能不是最好的。 – Nivas

+0

是的,有太多的記錄..和參考是nvarchar ..我將修改參考NUM的問題 – grayman

+0

我想嘗試這樣的事: 'SELECT * FROM表WHERE 日期時間> = TRUNC(SYSDATE, 'DD') 及其在referencenum(SELECT referencenum FROM表 GROUP (*)= 1)' –

回答

1

你可以做一個單一的表掃描(比較t o使用分析函數使用NOT EXISTS其中將使用兩個表掃描): SQL Fiddle

的Oracle 11g R2架構設置

CREATE TABLE table_name (ReferenceNum, DateTime, Type) AS 
SELECT '123ab', SYSDATE, 'Request' FROM DUAL UNION ALL 
SELECT '123ab', SYSDATE, 'Response' FROM DUAL UNION ALL 
SELECT '456cd', SYSDATE, 'Request' FROM DUAL UNION ALL 
SELECT '456cd', SYSDATE - 2, 'Response' FROM DUAL UNION ALL 
SELECT '789ef', SYSDATE, 'Request' FROM DUAL; 

查詢1

SELECT ReferenceNum 
FROM ( 
    SELECT ReferenceNum, 
     COUNT(CASE WHEN TRUNC(DateTime) = TRUNC(SYSDATE) THEN 1 END) 
      OVER (PARTITION BY ReferenceNum) AS num_today, 
     COUNT(CASE WHEN TRUNC(DateTime) <> TRUNC(SYSDATE) THEN 1 END) 
      OVER (PARTITION BY ReferenceNum) AS num_other_day 
    FROM table_name t 
) 
WHERE num_today = 1 
AND num_other_day = 0 

Results

| REFERENCENUM | 
|--------------| 
|  789ef | 
+0

我選擇了這個答案作爲答案,因爲它比其他2個答案及時返回答案 – grayman

0

使用NOT EXISTS操作

SELECT A.referenceNum, A.datetime, A.Type 
from table A 
    where A.datetime >= sysdate - 1 
    AND NOT EXISTS (
    SELECT null FROM table B 
    WHERE A.referenceNum = B.referenceNum 
     AND b.datetime < a.datetime 
) 
+0

抱歉,即使我試圖在條件下添加更多結果,結果也會返回太長時間。非常感謝您的幫助! – grayman

0
SELECT referenceNum 
FROM A A1 
WHERE TRUNC(A1.datetime) > TRUNC(sysdate)-1 
AND A1.Type    = 'Request' 
AND NOT EXISTS 
    (SELECT 1 
    FROM A 
    WHERE TRUNC(A.datetime) >= TRUNC(sysdate)-1 
    AND A.Type    = 'Response' 
    AND A.referenceNum  = A1.referenceNum 
) 
+0

對不起,即使我試圖添加更多條件,結果也會返回太長時間。非常感謝您的幫助! – grayman