2010-07-21 86 views
1

我有一個表跟蹤序列號和與所述序列號關聯的許可證數量。客戶可以重新授權一個盒子,增加或減少用戶的數量,並且他們只是針對更改的金額收費。SQL組通過問題 - 選擇哪個行被分組

下表結構存在:

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 

如果我在查詢取消註釋GROUP BY子句中,我得到oldid爲26的行。我如何只選擇最近日期的行(oldid爲34的行)?我可以使用ORDER BY和LIMIT 1,但我也希望能夠在沒有WHERE子句的情況下從整個表中進行選擇。

我正在使用MySQL 5.1。

回答

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的一個相當惱人的限制,即說「從與記錄讓我場X字段Y的最大值「要求我通過嵌入式查詢來查找表的最大值,然後再次讀取它以重新查找具有該值的記錄並檢索我想要的其他值。

如果同一個串行有三條記錄,上面應該在輸出上給出兩個「差異」行。我想這就是你想說的。如果給定的串行只有一條記錄,則上述將不會爲該串行輸出,這可能是您想要的,也可能不是。

+0

這正是我想要的,謝謝。我認爲有一個更容易的SQL方法「從字段Y的最大值記錄字段X」,但我猜不是。 – HalfBrian 2010-07-21 16:51:47

1

將派生表是任何用途;像...

SELECT * 
    FROM (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 
       ORDER BY oldid DESC) AS inner_table 
    GROUP BY id;