2015-09-04 106 views
-2

當用戶選擇查看最近記錄的選項時,我有要求顯示最新記錄。我有3個不同的表格,我可以從中獲取數據並顯示在屏幕上。僅顯示最近記錄

下面是創建的示例表。

Create table one(sealID integer,product_ser_num varchar2(20),create_time timestamp,status varchar2(10)); 


create table two(transID integer,formatID integer, formatStatus varchar,ctimeStamp timestamp,sealID integer); 

create table three(transID integer,fieldStatus varchar,fieldValue varchar,exctype varchar); 

我加入了3個表格,並在單個屏幕上顯示結果。我想根據時間戳顯示最近的記錄。 請從3個不同的表中找到屏幕上的樣本數據。

ProductSerialNumber formatID formatStatus fieldStatus TimeStamp 
ASD100    100  P    P  2015-09-03 10:30:22 
ASD100    200  p    P  2015-09-03 10:30:22 
ASD100    100  p    P  2015-09-03 10:22:11 
ASD100    200  p    P  2015-09-03 10:22:11 

我想顯示由以上顯示錶,應該返回前兩排,因爲他們最近的記錄時與時間戳列檢查最近的記錄。

請建議對下列查詢進行哪些更改才能顯示最近的記錄。

SELECT transId,product_ser_num,status, to_char(timestamp, 'yyyy-mm-dd hh24:mi:ss') timestamp, 
         cnt 
        FROM (SELECT one.*, 
        row_number() over(ORDER BY 
        CASE    
        WHEN :orderDirection like '%asc%' THEN 
        CASE 
         WHEN :orderBy='product_ser_num' THEN product_ser_num, 
         WHEN :orderBy='status' THEN status 
         WHEN :orderBy='timestamp' THEN to_char(timestamp, 'yyyy-mm-dd hh24:mi:ss') 
          ELSE to_char(timestamp, 'yyyy-mm-dd hh24:mi:ss') 
        END 
           END ASC, 
            CASE 
        WHEN :orderDirection like '%desc%' THEN 
        CASE 
        WHEN :orderBy='product_ser_num' THEN product_ser_num, 
            WHEN :orderBy='status' THEN status 
            WHEN :orderBy='timestamp' THEN to_char(timestamp, 'yyyy-mm-dd hh24:mi:ss') 
            ELSE to_char(timestamp, 'yyyy-mm-dd hh24:mi:ss') 
            END   
           END DESC , transId ASC) line_number 
           FROM (select one_inner.*, COUNT(1) OVER() cnt 
        from (select two_tran.transaction_id, 
            one_res.product_serial_number productSerialNumber, 
            one_res.status status,from one one_res 
            left outer join two two_trans on two_trans.sealID = one_res.sealID 
            left outer join three three_flds on two_tran.transID = three_flds.transID and (three_flds.fieldStatus = 'P') 
+1

始終將您的Oracle數據庫版本發佈至4位小數位。並請張貼樣本數據,不要張貼圖片,它根本沒有幫助。請發佈創建和插入語句,併發布所需的輸出。 –

+0

oracle10g是使用的版本。當我看到圖像時,我想它會給出清晰的表格結構圖。要求是顯示最近的記錄。 @lalith kumar B – scrit

+1

很難看到圖像,也不可能從圖像中複製文本。您可以準備[SQL小提琴](http://sqlfiddle.com/)或在問題中發佈創建和插入語句。 –

回答

0

這個查詢看起來非常龐大和複雜,所以這可能是過於簡單化的東西:

添加一個條款,最終limit 3

+0

它不總是3records.please讀取基於時間戳的問題。請參閱image1並閱讀以下內容。 @collin Driscoll – scrit

0

我認爲你需要做的是:

select 
    max(timestamp), engine_serial_number, formatID 
from 
< 
joins here 
> 
group by engine_serial_number, formatID 

這將基本上給你你想要的線條,但不是所有的元數據。

因此,你只需要re-join所有這一切與主要加入獲取其餘的信息(加入所有三列,engine serial number,formatID AND timestamp)。

這應該工作。

希望這會有所幫助!

+0

PS - 您可能想使用id列而不是時間戳來獲得更好的性能。你只需要確保更高的時間戳肯定意味着更高的ID(通常應該)。 –

+0

但是,如果使用ID列,我應該如何根據時間戳知道它應該返回多少條記錄。因爲我的要求是返回我認爲需要檢查時間戳的最新記錄。請建議。 @Mihai OvidiuDrăgoi – scrit

+1

使用時間戳,看看它返回。然後按我的建議使用id。應該沒有區別。對不起,遲到了,我正在度假。 –

1

我不認爲你正在尋找一個Top-n作爲你的主題標題暗示的查詢。

您似乎想按自定義順序顯示數據,就像您在第一張圖片中顯示的那樣。你想要根據timestamp將三行組合在一起。

我已經準備了一個小的測試案例來證明行的客戶訂單:

SQL> WITH DATA(ID, num, datetime) AS(
    2 SELECT 10, 1001, SYSDATE  FROM dual UNION ALL 
    3 SELECT 10, 6009, SYSDATE  FROM dual UNION ALL 
    4 SELECT 10, 3951, SYSDATE  FROM dual UNION ALL 
    5 SELECT 10, 1001, SYSDATE -1 FROM dual UNION ALL 
    6 SELECT 10, 6009, SYSDATE -1 FROM dual UNION ALL 
    7 SELECT 10, 3951, SYSDATE -1 FROM dual 
    8 ) 
    9 SELECT ID, 
10 num, 
11 TO_CHAR(DATETIME, 'yyyy-mm-dd hh24:mi:ss') TIMESTAMP 
12 FROM 
13 (SELECT t.*, 
14  row_number() OVER(ORDER BY DATETIME DESC, 
15  CASE num 
16  WHEN 1001 
17  THEN 1 
18  WHEN 6009 
19  THEN 2 
20  WHEN 3951 
21  THEN 3 
22  END, num) rn 
23 FROM DATA t 
24 ); 

     ID  NUM TIMESTAMP 
---------- ---------- ------------------- 
     10  1001 2015-09-04 11:04:48 
     10  6009 2015-09-04 11:04:48 
     10  3951 2015-09-04 11:04:48 
     10  1001 2015-09-03 11:04:48 
     10  6009 2015-09-03 11:04:48 
     10  3951 2015-09-03 11:04:48 

6 rows selected. 

現在,你可以看到,在相同ID10NUM值進行分組,並以自定義順序。

+0

我不想根據時間戳定製訂單或組合。我已經編寫邏輯以降序顯示記錄。我唯一的要求是隻顯示最近的記錄,而不是顯示所有的記錄。而且因爲我的數據庫查詢對於連接和嵌套查詢來說太大了,所以我不知道如何繼續以及在哪個塊中需要給出條件來實現這一點。請建議,感謝您的幫助,謝謝。@ lalit Kumasi B – scrit

+0

@scrit您的查詢太大,無法通過查看來進行調查。你能否按照確切的要求進行精確定位併發布樣本數據,就像我使用WITH子句發佈一樣。 –

+0

請參閱修改後的代碼。我簡化了它並添加了數據庫查詢。請建議。謝謝。 – scrit

0

很難給你一個確切的答案,因爲你的查詢是不完整的。但是我會給你一個總體思路,並且可以將它調整到你的查詢中。

之一來完成你想要什麼樣的方式是通過使用dense_rank()分析功能的降序排列時間戳號碼您行(你可以在這種情況下使用rank()過,它實際上並沒有此事)。具有相同時間戳的所有行將被分配相同的「等級」,因此您可以按等級過濾僅獲取最近的記錄。

嘗試查詢調整到這樣的事情:

select ... 
    from (select ..., 
       dense_rank() over (order by timestamp desc) as timestamp_rank 
      from ...) 
where timestamp_rank = 1 
... 

我懷疑有更好的瞭解你的數據模型和查詢的,有可能會是一個更好的解決方案。但根據所提供的信息,我認爲上述應該會產生您正在尋找的結果。

+0

它不是顯示2行...請參閱顯示的示例數據中的時間戳列。它應該返回最近的記錄,因爲前兩個記錄在同一時間,它們是最近的記錄,它應該返回這兩行。因此,如果在同一時間戳上有n個記錄,那麼如果它們是最新記錄,那麼我的查詢應返回n個記錄。謝謝。 @sstan – scrit

+0

@scrit:您的需求是否根據':orderBy'和':orderDirection'的值來更改?或者你總是希望通過時間戳記?另外,請修復您發佈的查詢。目前尚不完整。 – sstan

+0

我總是希望返回可以使用表1中的時間戳列獲取的最新記錄數據。請建議..謝謝。我會盡力解決我發佈的查詢。 @sstan。 – scrit