線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2054
推到 Plurk!
推到 Facebook!

在重複資料中,分類取出日期最新的資料..

尚未結案
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-06-17 20:11:53 IP:203.66.xxx.xxx 未訂閱
請教一下各位先進 : 我在 MSSQL 中,有一個 Table 有設 Primary Key (唯一),資料欄位內有一時間欄位,我希望透過一些條件 SELECT 出所需的資料,但需要排除某個宣告為 Char(21) 的欄位重複的值,在這些重覆的值中挑選出時間最新的資料... Ex : PK F1 KF TF ---------------------------------------- 1 A1 K1 2004/4/13 18:00 2 A1 K1 2004/4/14 18:00 3 A2 K1 2004/4/19 18:00 4 A2 K1 2004/4/13 18:00 5 A3 K1 2004/4/13 18:00 6 A3 K1 2004/4/17 18:00 7 A4 K1 2004/4/17 18:00 8 A4 K1 2004/4/13 18:00 9 A5 K2 2004/4/13 18:00 10 A5 K2 2004/4/14 18:00 條件篩選類似 WHERE KF='K1' , 刪除重複值後取出最新的資料.. 結果會類似以下 PK F1 KF TF ---------------------------------------- 2 A1 K1 2004/4/14 18:00 3 A2 K1 2004/4/19 18:00 6 A3 K1 2004/4/17 18:00 7 A4 K1 2004/4/17 18:00 如果先取資料後再利用 Delphi 運算,這我已經有解法了,但是我想知道是否有直接利用 SQL Command 的方式可以解決這個問題.. 我有試過 Group By,但是 Group By 若是要取得全部資料,要在 Group By 後加入欲取的欄位串列,但加入 PK 值後結果便不同... 利用 DISTINCT 也是類似這樣的結果.... ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ----
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-06-17 20:46:56 IP:218.32.xxx.xxx 未訂閱
SouthWind 兄你好: 試試看, 是不是您所要的 SELECT * FROM [TableName] A WHERE A.KF='K1' AND A.TF=(SELECT MAX(TF) FROM [TableName] B WHERE B.F1=A.F1 AND B.KF=A.KF)
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-06-17 21:24:57 IP:203.66.xxx.xxx 未訂閱
引言: SouthWind 兄你好: 試試看, 是不是您所要的 SELECT * FROM [TableName] A WHERE A.KF='K1' AND A.TF=(SELECT MAX(TF) FROM [TableName] B WHERE B.F1=A.F1 AND B.KF=A.KF)
Mickey Sir 您好 : 我找到出現重複的問題了,之前我寫了一個類似 Mickey Sir 的 SQL Command ,不過一直發現出現了重複的值,我以為是我邏輯有問題, Try 了 Mickey Sir 的 Code 後發現了依然是有重複的資料顯示 原因就在於,其中有許多資料是連時間都重複的,所以還是會跑出重複的資料,若時間不重複,則結果正確 這樣的狀況能只靠 SQL Command 就解決嗎?? PS. Sorry ,我對我的問題了解不夠深入,做了錯誤的描述.. ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ----
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-06-17 22:06:52 IP:218.32.xxx.xxx 未訂閱
試試看: SELECT A.* FROM TTT A WHERE A.KF='K1' AND A.TF=(SELECT MAX(TF) FROM TTT B WHERE B.F1=A.F1 AND B.KF=A.KF) AND (SELECT COUNT(*) FROM TTT C WHERE C.F1=A.F1 AND C.KF=A.KF AND C.TF=A.TF)=1 UNION SELECT A.* FROM TTT A WHERE A.KF='K1' AND A.TF=(SELECT MAX(TF) FROM TTT B WHERE B.F1=A.F1 AND B.KF=A.KF) AND (SELECT COUNT(*) FROM TTT C WHERE C.F1=A.F1 AND C.KF=A.KF AND C.TF=A.TF)>1 AND A.PK=(SELECT MAX(PK) FROM TTT D WHERE D.F1=A.F1 AND D.KF=A.KF AND D.TF=A.TF) ORDER BY PK PS. 取出 TF 相同的 最大 PK, 若要最小的 PK , 最後一行改 "MIN"
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-06-18 09:26:42 IP:210.65.xxx.xxx 未訂閱
Hi All,    Sorry !! 插一下花,另一種 SQL Command 寫法
select  *
from    TableName t
where   pk =   (select  max(pk)
                from    TableName t1
                where   t1.kf = t.kf
                and     t1.tf =    (select  max(tf)
                                    from    TableName t2
                                    where   t2.kf = t.kf))
原理同前述 Mickey 版大所言 ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-06-21 18:44:25 IP:203.66.xxx.xxx 未訂閱
引言: Hi All, Sorry !! 插一下花,另一種 SQL Command 寫法
select  *
from    TableName t
where   pk =   (select  max(pk)
                from    TableName t1
                where   t1.kf = t.kf
                and     t1.tf =    (select  max(tf)
                                    from    TableName t2
                                    where   t2.kf = t.kf))
抱歉,因為一時間看不懂 Mickey Sir 的 Code 研究了老半天才看懂,所以晚回了.. To Mickey Sir : 感謝您的 Code ,很令人意外的是,從分析工具的 Plan 看起來,效率還不錯,看起來雖然 Code 有點長,不過執行卻令人驚奇,結果也很正確.. To Fishman Sir : 不知道我有沒有誤會您 Code 的意思,您的 Code 似乎只能掃出一筆資料,還是感謝您撥空討論.. SQL 上的邏輯跟一般程式邏輯迥異,我利用一些 View Table 與自訂函數模擬程式上的邏輯,雖然結果正確但卻在效率上碰上了大釘子... 想順便請教 Mickey Sir 釣魚的方法,要怎樣校調所下 SQL Command 的效率.. 以及建 Index 的一些原則與時機.. ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ---- 發表人 - SouthWind 於 2004/06/21 18:48:11
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-06-21 22:20:47 IP:218.32.xxx.xxx 未訂閱
引言: 想順便請教 Mickey Sir 釣魚的方法,要怎樣校調所下 SQL Command 的效率.. 以及建 Index 的一些原則與時機..
釣魚的方法...請教 Fishman 兄可能比較恰當, 哈哈...開玩笑的.< > 我真的不知啥是...釣魚的方法< > 其實, SQL 因為功能強大, 相對的也衍生一些效率的問題與爭議... 只是個人的經驗談, 不一定對, 姑且參考看看: 1. Index 之 Column Member 越少越好...這好像是廢話...其實, 我想說 的, 是盡量正規化, 這樣...>> > 發表人 -
系統時間:2024-07-03 5:21:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!