2014-01-07 19 views
0

我想解决类似下面的数据的情况下出现问题的复制项目,SQL组又忽略另一列

company customer pay sequence 
a  x  5 1 
a  x  6 2 
b  x  3 3 
b  y  4 4 
a  y  2 5 

而且我希望有通过计算求和结果公司的“支付”组,但重复的客户将仅根据最新的顺序使用一次。因此,预期的结果是

company sum(pay) 
a  8 
b  7 

意思是说,“A”公司和(收费)8来自于第二行加上最后一排。 公司“b”总和(支付)7来自第3和第4行。第一行被忽略。

因此,我用这样的查询(PostgreSQL的)来解决这个问题,

select t2.company,sum(t2.pay) from mytable t2 join (
    select company,customer,max(sequence) as sequence 
    from mytable group by company,customer 
) t1 on t1.sequence=t2.sequence group by t2.company 

我想知道是否有使用查询,而无需子查询与上述任何更简单的方法?

+2

什么是关于您的查询 “不容易”?对我来说这似乎很合理。 –

回答

2

在Postgres里,你可以这样做没有join,通过使用distinct on语法:

select t.company, sum(t.pay) 
from (select distinct on (company, customer) company, customer, pay 
     from mytable 
     order by company, customer, sequence desc 
    ) t 
group by t.company; 

我喜欢在OP的方法,因为它是标准的SQL。 distinct on声明仅限于Postgres。

+0

+1,很好,不知道在Postgres – Lamak

0

另一种方式来做到这一点是使用ROW_NUMBER,但我不知道你是否可以说,它是一个“容易”的方式:

WITH CTE AS 
(
    SELECT *, 
     ROW_NUMBER() OVER(PARTITION BY company, customer 
          ORDER BY sequence DESC) AS RN 
    FROM YourTable 
) 
SELECT company, 
     SUM(pay) AS pay 
FROM CTE 
WHERE RN = 1 
GROUP BY company 
ORDER BY company 

的结果是:

╔═════════╦═════╗ 
║ COMPANY ║ PAY ║ 
╠═════════╬═════╣ 
║ b  ║ 7 ║ 
║ a  ║ 8 ║ 
╚═════════╩═════╝ 

And here is带有演示的sqlfiddle供您试用。

0

使用Windows功能是另一种选择,
虽然我不确定这是一种更容易还是更快的方法。
在我的观点中,没有子查询就无法完成。

SELECT company,sum(pay) 
FROM (
    SELECT *, 
      max(sequence) OVER (partition by company,customer) max_seq 
    FROM table1 
) AS t 
WHERE sequence = max_seq 
GROUP BY company 

演示:http://www.sqlfiddle.com/#!15/f66b3/4