SQL获取最先创建的金额最高的行

时间:2013-08-28 01:05:55

标签: mysql sql greatest-n-per-group

在Mysql 5.5数据库中,我有一个表。 最初,我只需要最高金额的第一张唱片。

bid
----------------------
id           int
personId     int
itemId       int
amount       double
tieBreak     boolean
updatedDate  datetime

DATA:

id       personId        itemId       amount     tiebreak     updatedDate
----------------------------------------------------------------------------------
1           4             111          100          1         2013-08-26 09:00:00
2           5             111          100          0         2013-08-26 10:00:00
3           6             111          100          1         2013-08-26 11:00:00
...
4           24            222          200          0         2013-08-27 09:00:00
5           57            222          200          0         2013-08-27 10:00:00
6           12            222          200          0         2013-08-27 11:00:00
...
7           2             333          400          1         2013-08-27 11:00:00
8           7             333          300          1         2013-08-27 11:00:00
9           25            333          600          1         2013-08-27 11:00:00

我需要表格中每个itemId的最旧条目的整个记录​​,其中金额等于该项目的最大金额,而具有tieBreak的项目true(1)优先于具有tiebreak false(0)的项目。

id       personId        itemId       amount     tiebreak     updatedDate
----------------------------------------------------------------------------------
1           4             111          100          1         2013-08-26 09:00:00
4           24            222          200          0         2013-08-27 09:00:00
9           25            333          600          1         2013-08-27 11:00:00

1因为它是最早的记录,其中tiebreak = 1且数量最多 4因为它是最古老的记录,其他一切都是平等的 9因为它的金额最高

我最接近的是:

SELECT a.*
FROM bid a
LEFT OUTER JOIN bid a2 ON (a.itemId = a2.itemId AND a.amount < a2.amount)
WHERE a2.id IS NULL
ORDER BY tiebreak DESC, updatedDate ASC;

哪种作品可以拉回所有符合最高金额排序的出价... 我只想对每个项目进行单一最早的出价,其中最高金额和最高价值为抢七(1或0)。意味着抢七的金额为10,即使第二次出价第一次,也会以抢七0击败10。

1 个答案:

答案 0 :(得分:1)

您的条件列表适用于order by子句。唉,你不能在MySQL中轻松选择项目的第一项。

但是,有一个技巧 - 假设id唯一地标识每一行(如果这样的列名称没有该属性,那么就会感到羞耻)。您可以group_concat()使用order by按条件排序id。然后,substring_index()可以得到第一个。瞧!几乎就像MySQL支持row_number()(ANSI标准的方式来完成所有这些)。

以下是查询的内容:

select bid.*
from (select itemid,
             substring_index(group_concat(id order by amount desc, updateddate asc, tiebreak desc), ',', 1) as id
      from bid
      group by itemid
     ) b join
     bid
     on b.itemid = bid.itemid and b.id = bid.id;