2015-02-09 63 views
3

我對SQL相當新,並且正在嘗試編寫一個查詢,查找最後一次水錶是閱讀,所以我可以看到價值。有一個屬性表包含儀表和另一個表,用於存儲工程師的輸入。每個輸入被列爲一個序列,一個關鍵字列出了輸入類型和表達式列出了它們的輸入。最大順序並不總是答案。我想寫一個SQL嵌套查詢,發現/使用最大值來查找最大值之前的條目

我在找的是最後一次讀取水錶的電量,然後從前一個記錄(序列)中存儲的讀數中獲得電量值。爲了讓工程師輸入序列號更難,有些人需要輸入序列號(1,2,3),其他人需要輸入2(2,4,6),因此前面的輸入可能會減1或減2。

我可以編寫查詢來查找最大序列,另一個查找前一個或兩個前一個條目,但無法弄清楚如何使其成爲一個查詢。

找到網站12345的最大序列,我有:

SELECT MAX(M.SEQUENCE) maxseq 
FROM METERS M JOIN PROPERTY P ON M.PROPNUM = P.PROPNUM 
WHERE (P.CORP_ID ='12345' AND M.KEYWORD = 'WTR') 

我手動搜索條目之前得到用下面的查詢電力條目。

SELECT P.NAME, P.CORP_ID, M.KEYWORD, M.SEQUENCE, M.EXPRESSION 
FROM METERS M JOIN PROPERTY P ON M.PROPNUM = P.PROPNUM 
WHERE (P.CORP_ID ='12345') 
ORDER BY M.SEQUENCE 

我試過不同的嵌套查詢,但一直沒有能夠寫任何將工作。

,我很感興趣的米表如下所示的數據:

PROPNUM SEQUENCE KEYWORD EXPRESSION 
10a124 95  ELC  9845 
10a124 96  WTR  4521 
10a124 97  SVC  A105 
10a124 98  HEALTH GOOD 
10a124 99  DAY  150209 
10a124 100  HEALTH GOOD 
10a124 101  ELC  10283 
10a124 102  WTR  4621 

我使用屬性表找到我感興趣的部位PROPNUM因爲我有該網站的ID(CORP_ID),但而不是它的PROPNUM值。

我想返回的結果如下所示。

 
NAME WTR_EXPRESSION ELC_EXPRESSION 
SMITH 4621    10283 

+5

1)什麼是數據庫平臺? 2)請顯示樣品表數據和預期的輸出。 – OldProgrammer 2015-02-09 17:23:27

+0

副手,窗口查詢可能是您應該查看的內容。 – jpmc26 2015-02-09 17:31:33

+0

哪個DBMS? Postgres的?甲骨文?順便說一句:不要把蘋果和橙子比較''12345'是一個字符,'12345'是一個數字 – 2015-02-09 18:48:18

回答

1

可以inner joinMETER表到PROPERTY表一次爲每個KEYWORD,並指定爲SEQUENCE'ELC'(猜測KEYWORD)小於'WTR' SEQUENCE。如果你想做到這一點的

;with wtr_elc as (
    select 
     p.PROPNUM, 
     p.NAME, 
     max(w.SEQUENCE) as max_wtr_seq, 
     max(e.SEQUENCE) as max_elc_seq 
    from PROPERTY as p 
     inner join METERS as w 
      on w.PROPNUM = p.PROPNUM 
      w.KEYWORD = 'WTR' 
     inner join METERS as e 
      on e.PROPNUM = p.PROPNUM 
      and e.KEYWORD = 'ELC' 
      and e.SEQUENCE < w.SEQUENCE 
    where p.CORP_ID ='12345' 
    group by 
     p.PROPNUM, 
     p.NAME) 

select 
    wtr_elc.NAME, 
    wtr.EXPRESSION as WTR_EXPRESSION, 
    elc.EXPRESSION as ELC_EXPRESSION 
from METERS as wtr 
    inner join wtr_elc 
     on wtr_elc.PROPNUM = wtr.PROPNUM 
     and wtr_elc.max_wtr_seq = wtr.SEQUENCE 
    inner join METERS elc 
     on wtr_elc.PROPNUM = elc.PROPNUM 
     and wtr_elc.max_elc_seq = elc.SEQUENCE 
     and elc.KEYWORD = 'ELC' 
where wtr.KEYWORD = 'WTR' 

:由於您使用的SQL服務器,我們可以做到這一點在CTEinner join數據設置爲METER表中單列顯示每個KEYWORDEXPRESSION值更多或全部PROPERTY記錄,您可以修改CTE中的where子句。

+1

感謝您的幫助。有用。我得到兩排電力和一個水。我不得不對第一次內部連接做一點小改動。我必須將w更改爲m並刪除第二個條件(p.PROPNUM = e.PROPNUM)。有沒有辦法讓我可以找回每個表達式的兩個表達式? – Jason 2015-02-09 18:40:19

+0

你是指'METERS'表中的'SEQUENCE'值?您可以將'select m。*'更改爲'select m.SEQUENCE',或者在'METERS'或'PROPERTY'表中列出您想要的任何列。 – 2015-02-09 19:34:35

+0

使用您的解決方案,我得到了兩行答案。有沒有辦法讓他們在一排? – Jason 2015-02-09 20:20:40

相關問題