2012-01-10 10 views
1

のための最大値を取得:重複を排除し、私はこのようなテーブルを持っている各ID

ID  Signal Station Owner 
111  -120  Home  M1 
111  -120  Home  M1 
111  -120  Home  M2 
111  -120  Car  M1 
111  -120  Car  M2 
111  -120  Work  M1 
111 -120  Dept  M3 
111  -130  Car  M1 
111  -135  Work  M2 
222  -98  Home  M2 
222  -95  Work  M1 
222  -103  Work  M2 

私はIDごとに最大信号を返すようにクエリを必要とする:信号はrandom.Butで同じ表示いずれかである場合次のクエリは、信号が複数のステーションと所有者で同じであれば重複を返します。 this.Allフィールド上で私を助けてください、同じテーブル

ID Signal Station Owner 
111 -120  Dept  M3  
111 -120  Home  M1  
111 -120  Work  M2  
222 -95  Work  M1 

であるが、私は出て重複したエントリを必要

Here is the SQL: 

SELECT g.ID, g.MaxSignal, g.Station, g.OwnerID FROM (SELECT id, MAX(Signal) AS 
MaxSignal FROM t GROUP BY id) AS g inner join t ON g.id = t.id AND g.MaxSignal = t.Signal; 
+0

あなたは、行が一意になり、この表の他の列を持っていますか?プライマリキーかもしれない? – piotrm

+0

'SELECT'の直後に' DISTINCT'を使ってみてください –

+0

Signalは主にストアドプロシージャで使用される予約語なので、Signalの前後に引用符を追加しました。 – RolandoMySQLDBA

答えて

0

私はあなただけを使用することができると思う:代わりに

SELECT `ID`, MAX(`Signal`), `Station`, `OwnerID` FROM `table_name` GROUP BY `ID` 

あなたの質問の

+0

正しい。 'Station'と' OwnerID' _は(IDグループ内で)指定されていないことに注意してください。そして、私はそれらがお互いに同じ行から来る必要もないと思います。 –

+0

@LightnessRacesinOrbit:right - 'サーバーは各グループから任意の値を自由に選ぶことができます.'彼はいくつかのランダム性を望んでいました:)' signal'はキーワードであるため、列名を逆戻りしました – boobiq

+0

これは動作しません。 max(signal)であるが、残りの列の正確な値はランダムに選択されません。max(Signal)の対応する値が必要です – preeti

0

最初の選択の後に別のものを入れてみてください:

SELECT DISTINCT g.ID, g.MaxSignal, t.Station, t.OwnerID 
FROM 
(
    SELECT id, MAX(Signal) AS MaxSignal 
    FROM t 
    GROUP BY id 
) AS g 
INNER JOIN t ON g.id = t.id AND g.MaxSignal = t.Signal; 

この例のデータは表示されていますが、同じIDと(最大)信号を持ちますが、StationまたはOwnerまたはその両方の値が異なる行は動作しません。 SQL Serverのでは、私はROW_COUNT機能を使用して問題の周りになるだろう(MySQLでの同等の機能はありますか?):ここでは

SELECT Id, MaxSignal, Station, OwnerID 
FROM 
(
    SELECT 
     g.ID, 
     g.MaxSignal, 
     t.Station, 
     t.OwnerID , 
     ROW_NUMBER() OVER(PARTITION BY g.ID, g,MaxSignal ORDER BY t.Station) AS RowNumber 
    FROM 
    (
     SELECT id, MAX(Signal) AS MaxSignal 
     FROM t 
     GROUP BY id 
    ) AS g 
    INNER JOIN t ON g.id = t.id AND g.MaxSignal = t.Signal 
) AS T1 
WHERE RowNumber = 1 
+0

両方の行が等しい私は別の列を追加しました。 111 -120 Car 1 – preeti

+0

mysqlにROW_COUNTがない場合は、INNER JOINの右側にある相関サブクエリを使用して必要な結果を得ることができます。これは、MaxSignalとidが等しい。 –

0
SELECT DISTINCT g.ID, g.MaxSignal, t.Station, t.OwnerID 
FROM (SELECT id, MAX(Signal) AS MaxSignal 
     FROM t 
     GROUP BY id) AS g 
    INNER JOIN t 
     ON g.id = t.id 
      AND g.MaxSignal = t.Signal; 
+0

オペランドには1つの列しか含めることができません – preeti

+0

はまだ重複を取得しています – preeti

1

はあなたが必要とするクエリです:

ここ
SELECT DISTINCT B.* FROM 
(SELECT ID,`Signal`,MIN(CONCAT(Station,'-',Owner)) MaxStationOwner 
FROM (SELECT DISTINCT t.* FROM 
(SELECT ID,MAX(`Signal`) `Signal` FROM t GROUP BY ID) AAA 
LEFT JOIN t USING (ID,`Signal`)) AA 
GROUP BY ID,`Signal`) A 
INNER JOIN t B 
ON A.MaxStationOwner=CONCAT(B.Station,'-',B.Owner) 
AND A.ID=B.ID AND A.`Signal`=B.`Signal`; 

あなたのサンプルデータは、次のとおりです。ここで

drop database if exists preeti; 
create database preeti; 
use preeti 
create table t 
(ID int not null, 
`Signal` int not null, 
Station varchar(10), 
Owner varchar(10)); 
insert into t values 
(111,  -120 ,  'Home' , 'M1'), 
(111,  -120 ,  'Home' , 'M1'), 
(111,  -120 ,  'Home' , 'M2'), 
(111,  -120 ,  'Car' , 'M1'), 
(111,  -120 ,  'Car' , 'M2'), 
(111,  -120 ,  'Work' , 'M1'), 
(111, -120 ,  'Dept' , 'M3'), 
(111,  -130 ,  'Car' , 'M1'), 
(111,  -135 ,  'Work' , 'M2'), 
(222,  -98 ,  'Home' , 'M2'), 
(222,  -95 ,  'Work' , 'M1'), 
(222,  -103 ,  'Work' , 'M2'); 

はあなたのサンプルデータがロードされます。

ここで
mysql> drop database if exists preeti; 
Query OK, 1 row affected (0.03 sec) 

mysql> create database preeti; 
Query OK, 1 row affected (0.00 sec) 

mysql> use preeti 
Database changed 
mysql> create table t 
    -> (ID int not null, 
    -> `Signal` int not null, 
    -> Station varchar(10), 
    -> Owner varchar(10)); 
Query OK, 0 rows affected (0.06 sec) 

mysql> insert into t values 
    -> (111,  -120 ,  'Home' , 'M1'), 
    -> (111,  -120 ,  'Home' , 'M1'), 
    -> (111,  -120 ,  'Home' , 'M2'), 
    -> (111,  -120 ,  'Car' , 'M1'), 
    -> (111,  -120 ,  'Car' , 'M2'), 
    -> (111,  -120 ,  'Work' , 'M1'), 
    -> (111, -120 ,  'Dept' , 'M3'), 
    -> (111,  -130 ,  'Car' , 'M1'), 
    -> (111,  -135 ,  'Work' , 'M2'), 
    -> (222,  -98 ,  'Home' , 'M2'), 
    -> (222,  -95 ,  'Work' , 'M1'), 
    -> (222,  -103 ,  'Work' , 'M2'); 
Query OK, 12 rows affected (0.06 sec) 
Records: 12 Duplicates: 0 Warnings: 0 

mysql> 

が出力されます。

mysql> SELECT DISTINCT B.* FROM 
    -> (SELECT ID,`Signal`,MIN(CONCAT(Station,'-',Owner)) MaxStationOwner 
    -> FROM (SELECT DISTINCT t.* FROM 
    -> (SELECT ID,MAX(`Signal`) `Signal` FROM t GROUP BY ID) AAA 
    -> LEFT JOIN t USING (ID,`Signal`)) AA 
    -> GROUP BY ID,`Signal`) A 
    -> INNER JOIN t B 
    -> ON A.MaxStationOwner=CONCAT(B.Station,'-',B.Owner) 
    -> AND A.ID=B.ID AND A.`Signal`=B.`Signal`; 
+-----+--------+---------+-------+ 
| ID | Signal | Station | Owner | 
+-----+--------+---------+-------+ 
| 111 | -120 | Car  | M1 | 
| 222 | -95 | Work | M1 | 
+-----+--------+---------+-------+ 
2 rows in set (0.02 sec) 

mysql> 

はそれを試してみます!

CAVEAT

あなたは、テーブルtにこのインデックスを持っていることを確認してください:

ALTER TABLE t ADD INDEX ID_Signal_Index (ID,`Signal`); 
+0

t値(111、-120、 'Home'、2)に列を1つ追加しました まだ重複しています – preeti

+0

クエリを変更して追加行を追加しました。やってみよう !!! – RolandoMySQLDBA

+0

owneridの代わりにvarcharという所有者が必要です。出力が重複しています:IDシグナルステーションのオーナー ----- --------- ---------- --- ----- 111 -120ホームM1 111 -120仕事M2 222 -95仕事M1 – preeti

関連する問題