my sql篩選語法錯誤

表格:

---------國文----數學----英文

王小明----80------70------60

王小明----70------60------50

王小明----60------80------80

陳小明----80------60------70

陳小明----60------70------80

林小明----80------80------90

有重複名字的話,以"數學"高分來篩選

之後篩選結果如下

王小明----60------80------80

陳小明----60------70------80

林小明----80------80------90

6筆篩選剩3筆

現在語法...有錯誤,之前也發問過一次,好像也不能...

高分. SELECT * FROM(SELECT * FROM A order by math ASC) tmp GROUP BY name HAVING count(*)>=1

低分. SELECT * FROM(SELECT * FROM A order by math DESC) tmp GROUP BY name HAVING count(*)>=1

請大哥大姐幫解惑

謝謝

Update:

湯包哥,已經有另一種寫法了"select A.* from A,(select name,max(math) as math from A group by name) B where A.name=B.name and A.math=B.math"

這寫法雖然有點複雜...不過可以成功,現在我想再加個條件and國文高分,卡住了

Update 2:

題目意思是

現在我要多加一個條件,就是取數學高分跟英文高分

如果兩個條件沒達成,就篩選掉

直到兩個都有高分就選那筆

1 Answer

Rating
  • 湯包
    Lv 7
    1 decade ago
    Favorite Answer

    我的想法是應該先使用排序函數

    以姓名為群組 依分數高低給個排序號碼

    SELECT *, ROW_NUMBER() OVER (PARTITION BY name

      ORDER BY math DESC) AS sort

    FROM table

    結果如下:

    -----------國文---數學---英文---排序

    王小明----80------70------60------2

    王小明----70------60------50------3

    王小明----60------80------80------1

    陳小明----80------60------70------2

    陳小明----60------70------80------1

    林小明----80------80------90------1

    之後再挑選出排序為1的資料即可....

    SELECT name, chinese, math, english

    FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY name

           ORDER BY math DESC) AS sort

        FROM table) AS a

    WHERE sort=1

    想取數學最低分的

    將 DESC 改為 ACS 即可....

    2009-11-16 18:49:23 補充:

    不懂您的條件是什麼....

    如果有筆記錄是數學 80 英文 90

    另一筆是數學 90 英文 80

    您想要篩選哪筆記錄....@.@

Still have questions? Get your answers by asking now.