2014-01-07 24 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