Mysql:查询以查找具有最大值的行与tie breaker

时间:2009-11-09 19:37:07

标签: sql mysql

User     Region   Points   Last_Updated        
1        5        0        1-Nov-09        I want this row
2        1        5        30-Oct-09        
3        1        2        02-Nov-09        
2        2        7        02-Nov-09        and this row
3        2        5        02-Nov-09        

使用mysql数据库,我想抓住从区域X到区域Y的每个区域的所有点引导。如果点数相关,我想使用last_updated作为平局破坏者。我想出了一种方法来做到这一点,但它涉及在同一个表上的几个查询并将它们连接在一起。我不禁想到有更好的解决方案。任何想法。

2 个答案:

答案 0 :(得分:4)

这应该有效:

SELECT
     T1.User
FROM
     MyUnnamedTable T1
LEFT OUTER JOIN MyUnnamedTable T2 ON
     T2.Region = T1.Region AND
     (
          T2.Points > T1.Points OR
          (T2.Points = T1.Points AND T2.Last_Updated > T1.Last_Updated)
     )
WHERE
     T2.User IS NULL AND
     T1.Region BETWEEN x AND y

你基本上是这样说的,“给我所有的用户,其中没有其他用户在同一地区,并且有更多的积分或相同的积分以及更新的日期。”

答案 1 :(得分:0)

这是另一种选择:

SELECT T1.[User]
FROM MyUnnamedTable T1 INNER JOIN (select MAX(points*100000000+convert(varchar(8),last_updated,112)) as score, region
                                           from MyUnnamedTable
                                           group by region) t2 ON T2.Region = T1.Region AND (t1.points*100000000+convert(varchar(8),t1.last_updated,112))=score
WHERE T1.Region BETWEEN x AND y

在嵌套查询中,我们选择点和last_update组合的最大值。通过对最高有效位数进行编码,我们给予点更高的优先级。当存在平局时,包含last_update的低位数将打破平局。

SQL中的其他tiebreaking方法在http://sqlmag.com/t-sql/t-sql-tiebreakers

中讨论