2017-02-08 4 views
1

は、我々は最初の2行が重複して知られている(障害のあるソフトウェアの例えば結果)されている次の表SELECT行2列の特殊性に基づいて

orderId productId orderDate    amount  
1  2   2017-01-01 20:00:00 10 
1  2   2017-01-01 20:00:01 10 
1  3   2017-01-01 20:30:10 5 
1  4   2017-01-01 22:31:10 1  

を持っていると言うことができますので、注文ID + PRODUCTIDユニークキー

を削除する必要があります。どのようにこれを最も効率的な方法で行うのですか?

orderDateで1秒差がなかった場合、我々は差が

SELECT DISTINCT * FROM `table` 

を使用することができ、一つはGROUPBY使用することができます

SELECT `orderId`,`productId`,MIN(`orderDate`),MIN(`amount`) 
FROM table 
GROUP BY `orderId`,`productCode` 

を私はタイプ、後者のコマンドは非常に疲れる見つけますたくさんの列がある場合。他の選択肢は何ですか?

更新日:私はSnowflakeを使用しています。

+2

あなたはどのDBMSを使用していますか? –

+1

金額が異なる場合の対処方法2つのエントリのどちらを保持するかを決めるにはどうすればいいですか? –

+1

重複したレコードをテーブルから削除したいのですか、それとも選択しないだけですか? –

答えて

1

あなたのDBMSはROW_NUMBERウィンドウ関数をサポートしている場合は、

select * from 
(
select row_number()Over(Partition by orderId,productId order by orderDate asc) as rn,* 
From yourtable 
)a 
Where Rn = 1 
+0

OPがMySQLを使用しているようです。 – jarlh

+0

@jarlh:少なくともMariaDBは21世紀に到着しようとしています:https://mariadb.com/kb/en/mariadb/mariadb-1020-release-notes/ –

+0

@jarlh - True ..は見えませんでしたバックティック –

0

方が良い一致を持つレコードを除外するためにNOT EXISTSを使用することができます:あなたが持つレコードを取得したいかのように

select * from mytable 
where not exists 
(
    select * 
    from mytable other 
    where other.orderid = mytable.orderid 
    and other.productid = mytable.productid 
    and other.orderdate < mytable.orderdate 
); 
0

これがそうです共通orderidおよびproductidのレコード内の最小値はorderdateです。これは、以下のようにSQLで表すことができる:このクエリは列orderidproductid正確な重複を排除し、orderdateことができない

select * from mytable t where t.orderdate = 
    (select min(t2.orderdate) 
    from mytable t2 
    where t2.orderid = t.orderid 
    and t2.productid = t.productid); 

留意されたいです。これは実際には要求されていません。

関連する問題