2012-01-10 27 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如果Signal對於多個工作站和所有者是相同的,則以下查詢將返回重複項。請幫我出去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 2012-01-10 21:33:39

+0

嘗試在'SELECT'後面緊跟着'DISTINCT' – 2012-01-10 23:00:50

+0

在Signal的後面加上了引號,因爲Signal是主要用於存儲過程的保留字。 – RolandoMySQLDBA 2012-01-10 23:11:53

回答

0

我想你可以使用:

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

代替您的查詢

+0

正確。請注意,'Station'和'OwnerID' _將不會被指定(在'ID'分組內),我不認爲他們甚至必須來自同一行。 – 2012-01-10 20:21:24

+0

@LightnessRacesinOrbit:right - '服務器可以自由選擇每個組中的任何值,他想要一些隨機性:)並且我提取列名稱,因爲'signal'是關鍵字 – boobiq 2012-01-10 20:25:35

+0

這不行。我們將獲得最大值(信號),但不會給出確切的值,其餘列將隨機選取。我需要max(Signal) – preeti 2012-01-10 20:35:32

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和(最大)信號但行站或所有者或兩者具有不同值的行。在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

distinct將工作,如果兩行都相等if我已經添加了另一列。 111 -120 Car 1 – preeti 2012-01-10 22:26:23

+0

如果在mysql中沒有ROW_COUNT等價物,則可以通過在INNER JOIN的右側使用相關子查詢來實現所需結果,該查詢從t中選擇TOP 1行,其中MaxSignal和id是等於。 – 2012-01-10 22:45:54

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

操作數不同應該只包含一列 – preeti 2012-01-10 23:04:45

+0

仍然會得到重複 – preeti 2012-01-10 23:09:26

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) 重複仍然存在 – preeti 2012-01-11 00:01:58

+0

我更改了查詢並添加了附加行。現在就試試 !!! – RolandoMySQLDBA 2012-01-11 02:16:52

+0

我想要所有者作爲varchar而不是ownerid.I獲取輸出作爲重複項:ID信號站所有者 ----- --------- ---------- --- ----- 111 -120主頁M1 111 -120作品M2 222 -95作品M1 – preeti 2012-01-11 17:41:46