2017-07-11 22 views
0

我期待通過顯示"DATA_POINT_UPLOAD_DATA"."VALUE"的最新值(除'READY'之外)來運行我的查詢(下面)。目前,它顯示所有'READY'值,但是,我想通過顯示除執行時間之外的任何值來做相反的操作,但'READY'除外。SQL篩選器排除特定字符串

這裏是我當前的查詢:

select "DATA_POINT_UPLOAD_DATA"."LAST_UPDATED_TIMESTAMP" as "TIMESTAMP", 
       "DATA_POINT_UPLOAD_DATA"."VALUE" as "COMMENTS" 
from "DB"."COMPONENT" "COMPONENT", 
    "DB"."COMPONENT_DATA_POINT" "COMPONENT_DATA_POINT", 
    "DB"."DATA_POINT_UPLOAD_DATA" "DATA_POINT_UPLOAD_DATA" 
where "COMPONENT_DATA_POINT"."ID"="DATA_POINT_UPLOAD_DATA"."COMPONENT_DATA_POINT_ID" 
and  "COMPONENT"."ID"="COMPONENT_DATA_POINT"."COMPONENT_ID" 
    and "DATA_POINT_UPLOAD_DATA"."VALUE" ='READY' 
    and "DATA_POINT_UPLOAD_DATA"."LAST_UPDATED_TIMESTAMP" between ('01-JUN-17') and ('30-JUN-17') 
    and "COMPONENT_DATA_POINT"."NAME" ='StateOfItem' 
    and "COMPONENT"."SITE_ID" in('abc123'); 

任何幫助將不勝感激。

+0

對此和'DATA_POINT_UPLOAD_DATA「。」VALUE「='READY'的一個小改動應該能夠實現。 –

+0

對不起,我編輯了我原來的帖子。我希望它不會有超過5,500個結果......但是隻有執行時的最新結果。 – Fadiddy

+0

你想在READY之前的單行或全行嗎?有多個READY嗎? – dnoeth

回答

0

您現在要求的最新記錄是VALUE。但是,您只選擇VALUELAST_UPDATED_TIMESTAMP。所以你所要求的僅僅是每個VALUE的最大LAST_UPDATED_TIMESTAMP。在SQL中,這轉換爲MAX(last_updated_timestamp)GROUP BY value

Select 
    max(last_updated_timestamp) as "timestamp", 
    value as comments 
From db.data_point_upload_data 
Where value <> 'READY' 
and last_updated_timestamp between '2017-06-01' and '2017-06-30' 
and cdp_id in 
(
    select id 
    from db.component_data_point 
    where name = 'StateOfItem' 
    and component_id in (select id from db.component where site_id = 'abc123') 
) 
Group by value; 
+0

工作正常!謝謝! – Fadiddy

1

在你的WHERE子句中,你有這個:"DATA_POINT_UPLOAD_DATA"."VALUE" ='READY'。這意味着您想要顯示DATA_POINT_UPLOAD_DATA的值爲「READY」的行。

更改您的查詢,而不是使用=嘗試使用!=<>

SELECT "DATA_POINT_UPLOAD_DATA"."LAST_UPDATED_TIMESTAMP" AS "TIMESTAMP", 
    "DATA_POINT_UPLOAD_DATA"."VALUE"      AS "COMMENTS" 
FROM "DB"."COMPONENT" "COMPONENT", 
    "DB"."COMPONENT_DATA_POINT" "COMPONENT_DATA_POINT", 
    "DB"."DATA_POINT_UPLOAD_DATA" "DATA_POINT_UPLOAD_DATA" 
WHERE "COMPONENT_DATA_POINT"."ID" ="DATA_POINT_UPLOAD_DATA"."COMPONENT_DATA_POINT_ID" 
AND "COMPONENT"."ID"     ="COMPONENT_DATA_POINT"."COMPONENT_ID" 
AND "DATA_POINT_UPLOAD_DATA"."VALUE" !='READY' 
AND "DATA_POINT_UPLOAD_DATA"."LAST_UPDATED_TIMESTAMP" BETWEEN ('01-JUN-17') AND ('30-JUN-17') 
AND "COMPONENT_DATA_POINT"."NAME" ='StateOfItem' 
AND "COMPONENT"."SITE_ID"  IN('abc123'); 
+0

對不起,我編輯了我原來的帖子。我希望它不會有超過5,500個結果......但是隻有執行時的最新結果。 – Fadiddy

+0

你的意思是你想顯示'READY'之前的最新值? – MagdielAybar

+0

那麼,更像最新的價值(除了準備)。如果我使用!=它顯示所有其他值,這是解決方案的一半,但是我只想看到最新的這些值。 – Fadiddy

0

對不起,但這是一個可怕的查詢。幾乎只有大寫字母才能使可讀性最小化,沒有別名的表別名,二十五年前冗餘的連接語法,僅在特定語言設置中工作的日期字符串文字以及不必要的連接。

然後,您選擇帶有value = 'READY'的記錄,並說您想要的記錄爲而不是'READY'。那麼,那麼:WHERE NOT value = 'READY'或簡單地WHERE value <> 'READY'

這裏是改變查詢:

Select 
    last_updated_timestamp as "timestamp", 
    value as comments 
From db.data_point_upload_data 
Where value <> 'READY' 
and last_updated_timestamp between '2017-06-01' and '2017-06-30' 
and cdp_id in 
(
    select id 
    from db.component_data_point 
    where name = 'StateOfItem' 
    and component_id in (select id from db.component where site_id = 'abc123') 
); 

如果你只是想看到最新的n行,然後order by last_updated_timestamp desc limit <n>

+0

您的查詢輸出與我的一樣....這仍然不能回答我在找什麼。謝謝。 – Fadiddy

+0

你有'='READY'',我有'<>'READY''。我沒有看到兩個查詢如何返回相同的行。 –

+0

是的,我改變了!=在我的查詢中排除...然後輸出與你的相同。 – Fadiddy