SQL首先选择可能的重复项,还包括按日期排序的单个

时间:2016-02-26 20:22:31

标签: mysql sql

我有一个Sign Ups表,用于诸如

之类的事件
 name  | signup_date
--------------------
Maria  | 2016-02-24
Maria  | 2016-02-24
Maria  | 2016-02-24
David  | 2016-02-25
David  | 2016-02-25
George | 2016-02-26

有人可能不止一次注册,这是预期的行为。

我需要能够选择和订购,以便我可以获得所有重复的所有唯一记录。基本上,如果您多次注册,我希望在获得重复之前先以独特的方式浏览所有名称。我无法在一次查询中弄清楚如何做到这一点。

预期结果应如下所示:

 name  | signup_date
--------------------
Maria  | 2016-02-24 <- maria's first
David  | 2016-02-25 <- david's first
George | 2016-02-26 
Maria  | 2016-02-24 <- maria's 2nd
David  | 2016-02-25 <- david's 2nd
Maria  | 2016-02-24 <- maria's 3rd

所以大卫和乔治都有机会进入名单,按照注册日期排序,在玛丽亚拥有第二或第三选项之前,即使她在同一天注册所有3个选项。

3 个答案:

答案 0 :(得分:2)

您可以通过枚举注册(在MySQL的情况下使用变量)然后在该字段上排序来完成此操作:

select s.*
from (select s.*,
             (@rn := if(@name = name, @rn + 1,
                        if(@name := name, 1, 1)
                       )
             ) as rn
      from signups s cross join
           (select @rn := 0, @name := '') params
      order by name, signup_date
     ) s
order by rn, date;

答案 1 :(得分:0)

为什么不按名称命名,signup_date?

从名单中选择* [table],signup_date。

您也可以通过表主键desc进行排序。通过这种方式,您可以根据提交的内容查看Maria的所有条目。

答案 2 :(得分:0)

与AS ( SELECT名称,SignUp_date,ROW_NUMBER()OVER(按名称ORDER BY SignUp_date DESC划分)作为排名FROM #tmp ) 选择 a.NAME,a.SignUp_date 从一个 ORDER BY ranky,SignUp_date