小明 發問時間: 電腦與網際網路程式設計 · 1 0 年前

SQL查詢的問題

原始資料表類似這樣,包含3個欄位

序號 時間 代號

(1) 8月16日 上午12:30 123A

(2) 8月18日 下午8:30 1A32

(3) 8月18日 上午8:30 A231

如果我想以最新的時間傳回「代號」欄的值,以這個例子為1A32,請問查詢的語法該怎麼寫呢?非常感謝~ ^^

已更新項目:

不好意思,我把原始資料寫的詳細一點

產品 | 時間 | 版本

A | 8月16日 上午12:30 | dgs

A | 8月18日 下午8:30 | oev

A | 8月18日 上午8:30 | pwn

B | 8月16日 上午10:30 | vnw

B | 8月18日 下午7:30 | uig

B | 8月18日 上午9:30 | shr

如果我要列出各個產品最新的版本,請問查詢的語法該怎麼寫呢?非常感謝~ ^^

2 個已更新項目:

謝謝阿戊前輩的指導,不過SQL好像沒辦法判斷帶中文的時間的極大值,還是我們的資料庫的關係?我公司用的是informix,再次謝謝您的指導 ^^

6 個解答

評分
  • 1 0 年前
    最佳解答

    您的問題在sql server 很好做,但是在informix 就需要一點技巧了。

    select b.版本 from

    (SELECT 產品,max(時間)indate FROM 原始資料表

    group by 產品) a,原始資料表 b

    where a.產品 = b.產品 and a.時間 = b.時間

    以上這樣的sql,在sql server 一下子就跑出來了,但是informix就會回應[語法錯誤] , 也就是他不支援的意思(我問過ACER的DBA,這是informix的限制)

    因此,身為informix愛用者的您,需要用temp table來做,而且得用3個sql語句

    1.首先建立temp table(我取名LAMINATE ):

    CREATE TEMP TABLE LAMINATE ( 產品 CHAR(1), 時間 date ) LOCK MODE ROW

    2. 然後,將原先在subquery的資料抓出,丟到LAMINATE

    insert into LAMINATE

    SELECT 產品,max(時間)indate FROM 原始資料表

    group by 產品

    3.最後,優雅的,我們就可以把您要的版本,透過原始資料表和LAMINATE 暫存表抓出來囉!

    select b.版本 from LAMINATE a, 原始資料表 b

    where a.產品 = b.產品 and a.時間 = b.時間

    因此,如果在程式中要寫,您可能要用transation,沒辦法一行做掉囉!^_^

    參考資料: 使用二年informix經驗
  • 1 0 年前

    如果只是為了知道最新版本,應該先做時間的反向排序(view)在做類別的group by!!

    不是很簡單??

  • mj
    Lv 6
    1 0 年前

    try thatselect * from table where timestamp in (select max(timestamp) from table)

  • 阿戊
    Lv 7
    1 0 年前

    依補充資料: 

    select a.產品,a.t1,b.版本 from (select 產品,max(時間) as t1 from 資料表1 group by 產品) a,(select * from 資料表1) b where a.產品=b.產品 and a.t1=b.時間

    '先依[產品]挑出最後的[時間]點,再從子查訊裏挑出[版本]

    2006-08-20 17:20:01 補充:

    應該是你的欄位並不是標準的時間格式(或許是被設為文字欄位,且內容是自訂格式填入的...)

  • 您覺得這個回答如何?您可以登入為回答投票。
  • 1 0 年前

    我的想法是

    先執行排列以最新時間為準再來讀取第一筆資料並輸出代號因該就可以了~!

    SQL="select * from 資料表 Order By 時間 DESC "

    參考資料: 經驗
  • 忠明
    Lv 4
    1 0 年前

    基本上我覺得你的"序號" "時間"都算是時間, 合成一個欄位會方便很多

還有問題?馬上發問,尋求解答。