2010-01-15 55 views
2

我的查詢目前是:如何使用「group by」和三列數據?

SELECT x, MAX(z) AS mz, y FROM my_table GROUP BY x 

列x和Mz分別爲預期的返回,但最後一列,Y,不與其他兩個匹配。換句話說,我希望「y」列與x列當前的匹配mz列。我該如何解決這個問題?

更新:對不起,問題不是很清楚。我想執行以下查詢:

SELECT * FROM(SELECT X,MAX(Z)採用 MZ FROM MY_TABLE GROUP BY x)的右 JOIN(選擇Y,MAX(Z)採用MZ FROM MY_TABLE GROUP BY Y)b關於a.mz = b.mz

,而不必使用3個SELECT語句(也許這不是什麼大不了的事,但它似乎是低效的查詢給我。但我在SQL查詢很新,所以我不知道。)

更新#2:讓我說我的表看起來像E本:

------------------- 
| x | y | z | 
------------------- 
| 45 | h | 3 | 
| 23 | c | 5 | 
| 45 | e | 9 | 
| 23 | b | 12 | 
| 45 | x | 36 | 
| 33 | s | 44 | 
| 33 | p | 78 | 
------------------- 

我想返回以下內容:

------------------- 
| x | y | z | 
------------------- 
| 23 | b | 12 | 
| 45 | x | 36 | 
| 33 | p | 78 | 
------------------- 
+1

您是否認爲匹配?無法理解你想要什麼。 – Eduardo 2010-01-15 15:33:11

+0

我相信你需要擴展你的問題。例如,描述這些列代表什麼。 – tafa 2010-01-15 15:34:34

+0

你想要另一個組?請擴展並舉個例子!!! – gbianchi 2010-01-15 15:36:47

回答

3

你可以做

select s.x, s.mz, stuff.y 
from (select x, max(z) as mz from stuff group by x) s 
    left join stuff on stuff.x = s.x and stuff.z = s.mz; 
+0

該查詢不會產生所需的輸出。 having子句是無用的,因爲你只是用類似於1 = 1的條件過濾結果。 – 2010-01-15 16:42:11

+0

更新了它。新的工程。 – 2010-01-15 16:44:26

+0

非常感謝您的答覆。並感謝所有其他人的有用評論! – ldweeks 2010-01-16 04:03:09

2

如果我理解你的權利,你希望得到的Z x和y的所有組合最大。

如果屬實,你的說法應該是:

SELECT x, y, MAX(z) AS mz FROM my_table GROUP BY x,y 
1

我認爲你的問題還是有點朦朧。我認爲你的意思是這樣的:

對於你的表,你有一些值(X,Y和Z)。對於每個X,您可以有多個Y和Z,但是對於每個X,您想要返回與該X的最高Z對應的Y的確切值。

讓我們用一個示例。讓我們假設這是保留的天僱員生病在今年的一些曲目表:

員工,年,天病假 約翰,1999年,1 約翰,2000年,3 約翰,2001年8

你想知道,爲每一位員工,他們有病的時候最是哪一年。

Select Employee, Year, DaysSick 
    From SickDays SD 
    Join (Select Employee, MAX(DaysSick) DaysSick 
      From SickDays 
     Group By Employee) MSD ON SD.Employee = MSD.Employee 
           And SD.DaysSick = MSD.DaysSick 

這消除了你的選擇之一。可能有一種方法可以使用類似Oracle中的分析函數的方式獲取相同的數據,但性能不會更好。至少,你需要一遍才能找出最大值和第二次獲取(希望在索引列)來檢索完整的數據集。

1

要找到對共用同其最大(Z)(X,Y),我明白了。它需要做不同的選擇來找到每個人的最大(z)......但也許有一些黑客或奇怪的想法來做到這一點。

無論如何,做你自己的行爲並不難看,因爲你完全掃描了桌子兩次,接下來加入了部分結果(有點運氣,它將佔用不那麼多)。因此,它的時間將與表格成線性比例(如果x和y沒有太多不同的值):

總成本= X的分組成本+ Y的分組成本成本a不是很高的成本if x和y是離散的。

而你正在尋找max's,所以你必須全面掃描桌子,所以它是線性時間最少。

這是我的觀點:你不是在最佳到目前爲止:)

1

選擇「Y」在你的例子跟團由沒有定義的結果。 MySQL將返回它掃描的第一行,但其他數據庫可能會做一些完全不同的事情。如果你想獲得包含max(z)的行,它必須在子查詢或連接中完成。 http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html

select * from f f1 where z=(select max(z) from f f2 where f1.x=f2.x); 
+------+------+------+ 
| x | y | z | 
+------+------+------+ 
| 23 | b | 12 | 
| 45 | x | 36 | 
| 33 | p | 78 | 
+------+------+------+ 

select * from f; 
+------+------+------+ 
| x | y | z | 
+------+------+------+ 
| 45 | h | 3 | 
| 23 | c | 5 | 
| 45 | e | 9 | 
| 23 | b | 12 | 
| 45 | x | 36 | 
| 33 | s | 44 | 
| 33 | p | 78 | 
+------+------+------+