請教一個有關group by 的sql語法 |
答題得分者是:st33chen
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
這是一個售價歷史檔
select item , max(date) , price from PriceHis where date < 20080501 group by item 我想要抓取的資料是當條件是 date 為20080501 之前, date 為最大的那一筆 的price ,其他日期的都不顯示出來 ,但是根據group by 的語法中, 必須為 group by item , price 上述的語法才會正確, 因為資料量比較大,不想抓出太多筆,所以有這樣的需求出來,不知道各位大大有什麼方法可以解決 另外其中我有三個類似的table ,我必須要做union 起來抓去三個table中,該item 日期為最大的那一筆, 我試過,若只是一個table 的話 若上述的sql改為 select A.item , A.date , A.price from PriceHis A where A.date < 20080501 and A.date = (select Max(B.date) from PriceHis B where B.item=A.item group by B.item 這樣應該好像是OK的?? 但是若是有三個table要union 起來的話 ,好像就沒辦法這樣做, SQL也感覺越來越複雜 試問是否有更簡單的方式,可以取得資料呢??
------
ivankuo |
ko
資深會員 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
第一項 你都知道可以子查詢
就可以改成 select item , date , price from PriceHis where date =(select MAX(date) from PriceHis where date <20080501) 至於三個union 的部分要請提供各表的關聯才能知道如何做 ===================引 用 ivankuo 文 章=================== 這是一個售價歷史檔 select item , max(date) , price from PriceHis where date < 20080501 group by item 我想要抓取的資料是當條件是 date 為20080501 之前, date 為最大的那一筆 的price ,其他日期的都不顯示出來 ,但是根據group by 的語法中, 必須為 group by item , price 上述的語法才會正確, 因為資料量比較大,不想抓出太多筆,所以有這樣的需求出來,不知道各位大大有什麼方法可以解決 另外其中我有三個類似的table ,我必須要做union 起來抓去三個table中,該item 日期為最大的那一筆, 我試過,若只是一個table 的話 若上述的sql改為 select A.item , A.date , A.price from PriceHis A where A.date < 20080501 and A.date = (select Max(B.date) from PriceHis B where B.item=A.item group by B.item 這樣應該好像是OK的?? 但是若是有三個table要union 起來的話 ,好像就沒辦法這樣做, SQL也感覺越來越複雜 試問是否有更簡單的方式,可以取得資料呢??
------
====================== 昏睡~ 不昏睡~ 不由昏睡~ |
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
不好意思~~假設如下
select item , max(date) , price from APriceHis where date < 20080501 group by item union select item , max(date) , price from BPriceHis where date < 20080501 group by item uoion select item , max(date) , price from CPriceHis where date < 20080501 group by item 我要取得APriceHis, BPriceHis, CPriceHis 中每一個item 在2008/05/01 以前日期最大的那一筆price 基本上這三個table的 規格有點不同,我這裡舉例是相同的,應該明白我的意思吧??
------
ivankuo |
ko
資深會員 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
是要抓ABC中最大的DATE
還是A抓A的最大DATE,B抓B的最大DATE,C.... 如果是第二項各抓各的 那 select item , date , price from BPriceHis where date =(select MAX(date) from PriceHis where date <20080501) union select item , date , price from CPriceHis where date =(select MAX(date) from PriceHis where date <20080501) 不就可以了嗎!? 如果怕出現多筆那加個 TOP 1就好了!! ===================引 用 ivankuo 文 章=================== 不好意思~~假設如下 select item , max(date) , price from APriceHis where date < 20080501 group by item union select item , max(date) , price from BPriceHis where date < 20080501 group by item uoion select item , max(date) , price from CPriceHis where date < 20080501 group by item 我要取得APriceHis, BPriceHis, CPriceHis 中每一個item 在2008/05/01 以前日期最大的那一筆price 基本上這三個table的 規格有點不同,我這裡舉例是相同的,應該明白我的意思吧??
------
====================== 昏睡~ 不昏睡~ 不由昏睡~ |
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
小弟是要抓取APriceHis, BPriceHis, CPriceHis 中每一個item 在2008/05/01 以前日期最大的那一筆price
前輩指點的寫法得到的結果並不是我要的, 可能是我沒說明清楚 這三個table是我用來紀錄每件商品的歷史售價,因為鍵值,功能不同而有分別, 基本上同一件商品不會在同一天中在三個table出現重複的日期,且並不會因為日期越後面price 就會越小or 越大, 所以當我輸入一個日期要得到的是這三個table中在這個日期以前最大的那一筆日期, 我要得到那筆商品的金額 前輩的寫法只能取得a,b,c每一個table中同一個商品最大的那一筆 , top 1 也只是取得每個select 結果的一筆而已, 而我是要每一個商品在三個table中比較出來之後日期最大的那一筆 小弟公司的資料庫是as400 , 不能用top 1 , 只能用 fetch first 1 rows only
------
ivankuo |
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
若不考慮效率, 以下是不是您所想要的
( 我看您的需求是假設 各 item 的最大日不一定相同, KO 大大的解法是假設 各 item 的最大日是相同的 ) select * from ( select item, date, price from a where date<'20080501' union select item, date, price from b where date<'20080501' union select item, date, price from c where date<'20080501' ) aa, ( select item, max(date) from ( select item, max(date) from a where date<'20080501' group by item union select item, max(date) from b where date<'20080501' group by item union select item, max(date) from c where date<'20080501' group by item ) group by item ) bb where aa.item = bb.item and aa.date = bb.date 另外, 我用慣 oracle, 不知 db/400 的詳細情況, 照 oracle select item , max(date) , price from APriceHis where date < 20080501 group by item 應該會報錯才對, 因為 select item , max(date) , price 中 item 是 group 欄位, max(date) 是group用統計function, price 都不是, 會是報錯所在 又 union 和 union all 不同 union 有 distinct 功能, 所以, 三個 select 命令 union 起來的筆數會 <= 三個 select 命令筆數的加總 又 date 非常有可能是保留字或 function 名, 建議不要使用以免增加 debug 困難度. 敬請參考 ===================引 用 ivankuo 文 章=================== 不好意思~~假設如下 select item , max(date) , price from APriceHis where date < 20080501 group by item union select item , max(date) , price from BPriceHis where date < 20080501 group by item uoion select item , max(date) , price from CPriceHis where date < 20080501 group by item 我要取得APriceHis, BPriceHis, CPriceHis 中每一個item 在2008/05/01 以前日期最大的那一筆price 基本上這三個table的 規格有點不同,我這裡舉例是相同的,應該明白我的意思吧??
------
IS IT WHAT IT IS 我是 李慕白 請倒著唸. 又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-09-05 10:19:55, 註解 無‧
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |