我有一个表,跟踪序列号和与所述序列号相关联的许可证数量。客户机可以重新授权一个框,增加或减少用户数,并且只对更改的数量进行计费。
下表结构存在:

id - Auto Incrementing ID
serial - The serial number
numusers - the number of licenses
date - The date that the request was submitted, with the highest date being the number of users currently licensed

我有以下查询来选择已更新的许可证,如果仅重新提交一次许可证,则该查询有效。如果已多次重新提交,则返回对上一次更新的引用,以及在此之前的所有更新。
SELECT p.id as id, c.id as oldid, p.numusers-c.numusers AS dif, p.date, c.date
FROM `licenses` AS p
JOIN `licenses` AS c ON p.serial = c.serial
                    AND p.date > c.date
                    AND p.id <> c.id
WHERE p.id = 156
#GROUP BY p.id

数据集如下:
id  serial  numusers    date
26  1234    500         2010-07-14
34  1234    600         2010-07-15
156 1234    500         2010-07-21

当我运行查询时,得到以下结果:
id      oldid       dif         date          date
156     26          0          2010-07-21    2010-07-14
156     34          -100       2010-07-21    2010-07-15

如果在查询中取消对GROUPBY子句的注释,则会得到oldid为26的行。如何只选择最近日期的行(oldid为34的行)?我可以使用ORDERBY和LIMIT 1,但我也希望能够从整个表中选择而不使用WHERE子句。
我正在使用MySQL 5.1。

最佳答案

也许你想要的是:

select p.id, c.id as priorid, p.numusers-c.numusers AS dif, p.date, c.date as priordate
from licenses p
join licenses c on c.serial=p.serial
  and c.date=(select max(date) from licenses ref where ref.serial=p.serial
    and ref.date<p.date)
order by p.serial

我一直觉得SQL的一个相当烦人的限制是,“从字段Y的最大值记录中获取字段X”需要我读取表一次,以使用嵌入查询查找Y的最大值,然后再次读取,以重新查找具有该值的记录并检索我想要的其他值。
如果同一序列有三条记录,上面应该在输出上给出两条“差”线。我想这就是你想说的。如果给定序列只有一条记录,那么上面的命令将不会为该序列提供输出,这可能是您想要的,也可能不是。

关于sql - SQL按问题分组-选择要分组的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3301397/

10-16 15:21