Mysql Group By和Orderby问题

时间:2010-04-01 07:27:18

标签: mysql group-by sql-order-by

这是我的数据结构

alt text http://luvboy.co.cc/images/db.JPG

当我尝试这个sql

select rec_id, customer_id, dc_number, balance
from payments
where customer_id='IHS050018'
group by dc_number
order by rec_id desc;

某处出了点问题,idk

我需要

rec_id  customer_id   dc_number   balance

2        IHS050018      DC3        -1
3        IHS050018      52         600 

我希望客户的最近余额与dc_number相对应?

感谢名单

3 个答案:

答案 0 :(得分:1)

基本上有两种方法可以获得这个

select p.rec_id, p.customer_id, p.dc_number, p.balance
from payments p
where p.rec_id IN (
    select s.rec_id
    from payments s
    where s.customer_id='IHS050018' and s.dc_number = p.dc_number
    order by s.rec_id desc
    limit 1);

此外,如果您想获得每个客户的最后余额

select p.rec_id, p.customer_id, p.dc_number, p.balance
from payments p
where p.rec_id IN (
    select s.rec_id
    from payments s
    where s.customer_id=p.customer_id and s.dc_number = p.dc_number
    order by s.rec_id desc
    limit 1);

我认为另一种方法是利用这样一个事实,即按顺序选择rec_id,使用desc和limit 1等同于选择max(rec_id),并使用适当的group by,完整:

select p.rec_id, p.customer_id, p.dc_number, p.balance
from payments p
where p.rec_id IN (
    select max(s.rec_id)
    from payments s
    group by s.customer_id, s.dc_number
    );

这应该更快(如果你想要每个客户的最后余额),因为max通常比sort更便宜(索引可能是相同的)。

当这样编写时,子查询不相关(不需要为外部查询的每一行运行),这意味着它只运行一次,整个查询可以重写为连接。

另请注意,根据外部查询的选择性,将其写为相关查询(通过在内部查询中添加s.customer_id = p.customer_id和s.dc_number = p.dc_number)可能是有益的。

如果您只查找一行或几行的最后余额,这可能会提高性能。

答案 1 :(得分:0)

我认为没有窗口函数(如those in Postgres 8.4)在SQL中有一个好方法。您可能必须遍历代码中的数据集并以此方式获取最近的余额。

答案 2 :(得分:-1)

ORDER出现在GROUP之前:

select rec_id, customer_id, dc_number, balance
from payments
where customer_id='IHS050018'
order by rec_id desc
group by dc_number