2012-01-04 5 views
2

私はGROUP BYの質問に悩まされています(少なくとも私にとっては最も難しいものです)。GROUP BY - 前後のグループ分けを並べ替える

私がやりたいことは、別の列でグループ化された最新の変更されたレコードを取得することです。私が見ている問題は、グループ化は、(グループ内で)ORDER BYを無視して見つけた唯一の最初のレコードを返すことです(最終結果を返すときを除く)。

ここに私のコードの簡略版があります。

戻ります
SELECT events.id, events.name, events.type, events.modified_time 
FROM events 
GROUP BY events.type 
ORDER BY event.modified_time DESC 

1 | Event One | Birthday | Jan 1, 2012 
2 | Event Two | Graduation | Jan 1, 2012 

実際に遅い修正時間と第三の記録がある場合:

3 | Event Three | Birthday | Jan 2, 2012 

は私がのHAVING句を使用して試してみましたMAX(modified_time)でも正しい結果を返しません。たぶん私はちょうど知っている誰かとこれ以上議論する必要がありますが、質問が十分な意味がある場合は、私はおそらく簡単な答えが必要なことを言うことができる。

ボナス質問:
サブクエリなしでこれを行うことはできますか?

+0

'events.modified_time'をGROUP BY句に追加できませんか? –

+0

@Lievenそれで、2つの最新のものが本当に必要なときに私は3つのレコードを得るでしょう。 – Matthew

+3

ORDER BYはGROUP BYには影響しませんが、最終ソートにのみ影響します。 –

答えて

1

このような解析関数を使ってリンクティムのようなソリューションは、多くの他の方法の中で、あなたのために働く可能性があります:何が欲しいのいずれかである

SELECT a.id, a.name, a.[type], a.modified_time 
FROM [events] AS a 
    JOIN (
     SELECT MAX([events].id) AS id, [events].[type] 
     FROM [events] 
     GROUP BY [events].[type]  
    ) AS b ON a.id = b.id AND a.[type] = b.[type] 
ORDER BY a.modified_time DESC 
+0

あなたはより大きなidが後でmodified_timeに常に対応すると仮定しています。 – kurosch

+0

あなたはタイプを仮定しており、modified_timeは一意のキーです。 –

+0

lol ...私が持っているリンクされた解決策は、もう一方の方法も示しています。私たちはOPが望んでいるものを見るでしょう。 –

1

GROUP BY/HAVINGはあなたが望むものではありません。

WHERE 
    events.modified_time = (select max(modified_time) from events e2 where e2.type = events.type) 

...または他のROW_NUMBER

+0

同じmodified_timeを持つ同じタイプのイベントが複数ある場合、このような条件ですべてのイベントが返されることに注意してください。 – kurosch

+1

AFAIK、MySQLにはSQL ServerのROW_NUMBERのような概念はありません。 –

+1

MySQLでは 'ROW_NUMBER'は存在しません。 –

関連する問題