全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:5487
推到 Plurk!
推到 Facebook!

請教一個有關group by 的sql語法

答題得分者是:st33chen
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-08-15 12:11:02 IP:210.64.xxx.xxx 訂閱
這是一個售價歷史檔

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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-08-15 13:29:27 IP:61.66.xxx.xxx 訂閱
第一項 你都知道可以子查詢
就可以改成

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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-08-15 13:54:12 IP:210.64.xxx.xxx 訂閱
不好意思~~假設如下

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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-08-17 11:29:03 IP:61.66.xxx.xxx 訂閱
是要抓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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-08-18 09:51:05 IP:210.64.xxx.xxx 訂閱
小弟是要抓取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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-09-05 10:14:48 IP:122.116.xxx.xxx 訂閱
若不考慮效率, 以下是不是您所想要的 
( 我看您的需求是假設 各 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-09-05 11:40:09 IP:210.64.xxx.xxx 訂閱
st33chen前輩
您這個語法我參考之後來用,果真可以達到我要的結果,比我原來用的方式節省了約30~40秒的速度,
讓我學到了不同的sql語法組合,真是感謝阿~~~
------
ivankuo
系統時間:2024-04-27 3:35:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!