-3

重複をすべて削除し、金額が最も高い 1 つだけを保持する必要があります。おそらく、なんらかの JOIN 操作を行う必要がありますが、あまり経験がありません。私はこのクエリを持っています:

SELECT * 
FROM invoices 
GROUP BY user 
ORDER BY  amount DESC

すべての行をクエリし、それらを量で並べ替え、ユーザーごとにグループ化するときに重複を「削除」しますが、明らかに重複を削除しません。どんな助けでも大歓迎です。明確にするために、重複を完全に削除する必要があります。スキーマ:

 user varchar(125), amount int 
4

4 に答える 4

2

SELECT *を使用しても、レコードを除外することはありませんGROUP BY

SELECT user, MAX(amount) amount
FROM  invoices
GROUP BY user
ORDER BY amount DESC
于 2013-02-28T02:22:37.573 に答える
1

使い方によっては思い通りの結果が得られないことに注意してくださいGROUP BY。MySQLはその機能を拡張します。で選択されている列を常に指定したい場合GROUP BY:

SELECT col1, col2, AGGREGATE(col3)
FROM table
GROUP BY col1, col2

重複を見つけるすべての行を選択する必要があります

MAXそれぞれの金額を見つけるにはuser:

SELECT user, 
       Max(amount) AS amount 
FROM   invoices 
GROUP  BY user 

金額が最も高い行のみを保持します

オプション1

を使用しますLEFT JOIN(JW に感謝):

DELETE    invoices
FROM      invoices
LEFT JOIN 
     (SELECT user, MAX(amount) AS amount
     FROM invoices
     GROUP BY user) j 
          ON j.user = invoices.user 
              AND j.amount = invoices.amount
WHERE j.amount IS NULL

http://sqlfiddle.com/#!2/ce2f8/1

オプション 2

ステージング テーブルを作成します。

CREATE TABLE invoices (
  user int,
  amount decimal(5,2));

INSERT INTO invoices VALUES
(1, 100.00),
(1, 200.00),
(1, 300.00);

CREATE TABLE invoicesStg (
  user int,
  amount decimal(5,2));

INSERT INTO invoicesStg
(SELECT user, MAX(amount) AS amount
FROM invoices
GROUP BY user);

TRUNCATE invoices;

INSERT INTO invoices
SELECT user, amount
FROM invoicesStg;

DROP TABLE invoicesStg;

http://sqlfiddle.com/#!2/0381e/1

于 2013-02-28T02:25:11.863 に答える
1

重複を見つけるためだけに、次を試すことができます。

SELECT  id, COUNT(amount) AS cnt, MAX(amount) AS mx 
FROM    invoices 
GROUP   BY user HAVING cnt > 1 
ORDER   BY amount DESC

そこから、これらのレコードの削除に進むことができます。

于 2013-02-28T02:34:49.043 に答える
0

金額が最も高い行が必要な場合は、これを試してください。

select *
from invoices
order by amount desc
limit 1

「削除」の意味がわかりません。量が最も多い行以外のすべての行を本当に削除しますか?

于 2013-02-28T02:29:38.057 に答える