这是我的数据结构
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相对应?
感谢名单
答案 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