在重複資料中,分類取出日期最新的資料.. |
尚未結案
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
請教一下各位先進 : 我在 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 發送簡訊給我 |
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言: 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 發送簡訊給我 |
試試看: 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 發送簡訊給我 |
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 發送簡訊給我 |
引言: Hi All, Sorry !! 插一下花,另一種 SQL Command 寫法抱歉,因為一時間看不懂 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:11select * 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
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
引言: 想順便請教 Mickey Sir 釣魚的方法,要怎樣校調所下 SQL Command 的效率.. 以及建 Index 的一些原則與時機..釣魚的方法...請教 Fishman 兄可能比較恰當, 哈哈...開玩笑的.< > 我真的不知啥是...釣魚的方法< > 其實, SQL 因為功能強大, 相對的也衍生一些效率的問題與爭議... 只是個人的經驗談, 不一定對, 姑且參考看看: 1. Index 之 Column Member 越少越好...這好像是廢話...其實, 我想說 的, 是盡量正規化, 這樣...>> > 發表人 - |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |