2016-10-12 45 views
1

任何更好的解決方案得到這些多(有時會只有一行,有時 - 倍數)不子查詢與最小amount值的行?如果沒有更好的解決方案,那很好,只是有點傷心。 :)更好地選擇其中Max

My Table

我的第一個解決方案是這樣的(我不喜歡子查詢)

SELECT * FROM transactions 
WHERE wallet_id = 148 
    AND amount = (SELECT MIN(amount) FROM transactions WHERE wallet_id = 148) 

Result

+3

好消息是有一個更好的解決方案。閱讀[這個答案](http://stackoverflow.com/a/28090544/4265352)瞭解詳情。壞消息是我沒有心情應用在那裏發佈的技術來爲您的案例生成查詢。你必須自己動手:-) – axiac

+0

稍後我會做更多的測試,我只能在這裏訪問一個Sybase,它似乎並沒有在這裏被接受...... – AxelH

回答

2

的一般查詢,找到每個錢包其最低金額:

SELECT t1.* 
FROM transactions t1 
JOIN (SELECT wallet_id, MIN(amount) minamount 
     FROM transactions GROUP BY wallet_id) t2 
    on t1.wallet_id = t2.wallet_id and t1.amount = t2.minamount 

WHERE t1.wallet_id = 148 -- keep or remove this line 
+0

這看起來很整齊,你仍然存在一個子查詢:) – Rozkalns

+0

這是「它的」。只是說';-) – Strawberry

+0

@Strawberry,謝謝。我傾向於一遍又一遍地犯這個錯誤... – jarlh

0

有時稱爲「不包括JOI N「(在這裏,它也是一個」自我連接「,因爲我們使用表來加入自己)。連接的條件要求t1.amount大於t2.amount,然後通過where子句找到沒有匹配的行,因此我們有最低的t1.amount值。

SELECT 
     t1.* 
FROM transactions t1 
LEFT JOIN transactions t2 ON t1.wallet_id = t2.wallet_id AND t1.amount > t2.amount 
WHERE t1.wallet_id = 148 AND t2.wallet_id IS NULL 

見:http://data.stackexchange.com/stackoverflow/query/556758/left-excluding-self-join

也看到Left excluding JOIN

NB的圖:我不主張這是好還是 「正確」;只是它是一種替代