【问题标题】:Group BY serial number and select latest (last) created date for that record按序列号分组并选择该记录的最新(最后)创建日期
【发布时间】:2013-01-30 05:28:03
【问题描述】:

我有 1 个表列 id,serail_no,created。

我的显示是这样的

id  serail_no    created

1   1142B00072   2012-11-05 11:36:00
2   1142B00072   2012-12-20 14:57:54 
3   1142B00072   2012-12-28 13:20:54

4   1142B11134   2012-11-25 14:57:54  
5   1142B11134   2013-01-16 16:42:34

所以现在我想要这样的输出。

3   1142B00072   2012-12-28 13:20:54
5   1142B11134   2013-01-16 16:42:34

【问题讨论】:

  • @Catcall ,我已经上传了我的查询。也许现在你可以帮我解决我的问题。

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


【解决方案1】:

您可以使用子查询来获取每个serial_no 的最新记录。然后将子查询的结果加入原始表,以便您可以获取其他列。

SELECT  a.*
FROM    tableName a
        INNER JOIN
        (
            SELECT serial_no, MAX(created) max_date
            FROM    tableName
            GROUP BY serial_no
        ) b ON a.serial_no = b.serial_no AND
                a.created = b.max_date

【讨论】:

  • 感谢您的帮助,但现在我想在此查询中再添加一项功能。我有 serial_no_days (30,60,90) ,如何根据 (30,60,90 ) 找到当前日期和创建日期之间的剩余天数?
  • 我在 que 中附上了屏幕截图,也许现在你可以解决我的问题了。您的帮助将不胜感激。在那里你可以看到 days_left 列,第一个过期,第二个 4 天 remaning,第三个 49 天剩余到期许可证。所以我想找到 1 到 5 天之间的记录。但根据最新日期。
  • @DevangRathod 为什么要在WHERE 子句上添加一个条件,这样您就可以过滤掉您想要的结果。例如WHERE a.DaysLeft BETWEEN 1 AND 5
  • 我还是不明白你能解释一下吗。我如何将此 DATEDIFF(DATE_ADD(created, INTERVAL license_days DAY),CURDATE()) AS days_left 放入查询中。因为 days_left 列不在数据库中。它基于 created 、 license_days 和当前日期。
  • 你能帮我重新编写查询,以便我理解。
【解决方案2】:

另一种解决方案:使用排名函数

select * from (with t as 
(select 1 id , '1142B00072'  as serail_no ,to_date('2012-11-05 11:36:00','yyyy-mm-dd hh24:mi:ss') created from dual
union all 
select 2  id , '1142B00072'   as serail_no ,to_date('2012-12-20 14:57:54' ,'yyyy-mm-dd hh24:mi:ss') created from dual
union all
select 3  id , '1142B00072'   as serail_no ,to_date('2012-12-28 13:20:54','yyyy-mm-dd hh24:mi:ss') created from dual
union all
select 4  id , '1142B11134'   as serail_no ,to_date('2012-11-25 14:57:54'  ,'yyyy-mm-dd hh24:mi:ss') created from dual
union all
select 5  id , '1142B11134'  as serail_no ,to_date('2013-01-16 16:42:34','yyyy-mm-dd hh24:mi:ss') created from dual)
select id,serail_no,created,rank() over ( partition by SERAIL_NO order by created desc ) rn from t)
where rn=1`

【讨论】:

  • MySQL 不支持公用表表达式。它也不支持窗口函数。
猜你喜欢
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多