2011-07-14 15 views
0

すべてのSQLプロにとって、ここに挑戦します: 私は関心の2つの列、グループ、および誕生日を持つテーブルを持っています。一部の行だけにグループが割り当てられています。 私は今、生年月日でソートされたすべての行を印刷したいと思いますが、同じグループのすべての行が互いに隣り合っているようにしたいと思います。これを行う半賢明な唯一の方法は、ソート時にグループ内のすべての行のグループの平均誕生日を使用することです。質問は、これは純粋なSQL(この例ではMySQL)で行うことができますか、またはいくつかのスクリプトロジックが必要となるでしょうか?SQLを使っていくつかの行を平均で並べ替える

id | group | birthdate 
---+-------+----------- 
1 | 1  | 1989-12-07 
2 | NULL | 1990-03-14 
3 | 1  | 1987-05-25 
4 | NULL | 1985-09-29 
5 | NULL | 1988-11-11 

をして(これは見つけることができるのは、1987年5月25日および1989年12月7日の「平均」は1988年8月30日であることを言わせて:指定したテーブルで、説明するために

UNIXのタイムスタンプに相当する日付を平均して日付に変換することで、この平均値は完全に正しいとは限りません)。 出力は次のようになります。

id | group | birthdate | [sort_by_birthdate] 
---+-------+------------+-------------------- 
4 | NULL | 1985-09-29 | 1985-09-29 
3 | 1  | 1987-05-25 | 1988-08-30 
1 | 1  | 1989-12-07 | 1988-08-30 
5 | NULL | 1988-11-11 | 1988-11-11 
2 | NULL | 1990-03-14 | 1990-03-14 

任意のアイデア?

乾杯、 ジョン

+0

ですからによってソートしたいです同じグループに属する誕生日の平均?誰かがあなたの例で '1988-08-30'の誕生日を持っている場合、私はあなたの注文が保存されるかどうかわかりません –

+0

' 1988-08-30 'を持つ人は、グループ...私はこれが純粋なSQLでやるのは難しいことだと分かりますが、ちょうど=)の場合にのみ質問します。 –

+0

あなたはORDER BYグループ、生年月日はできませんか? – landoncz

答えて

2

I T-SQLで、通常のプログラム、私は完全にMySQLへの日付関数を翻訳していない場合ので、私を許してください:

SELECT 
    T.id, 
    T.group 
FROM 
    Some_Table T 
LEFT OUTER JOIN (
    SELECT 
     group, 
     '1970-01-01' + 
      INTERVAL AVG(DATEDIFF('1970-01-01', birthdate)) DAY AS avg_birthdate 
    FROM 
     Some_Table T2 
    GROUP BY 
     group 
    ) SQ ON SQ.group = T.group 
ORDER BY 
    COALESCE(SQ.avg_birthdate, T.birthdate), 
    T.group 
+0

'MIN(birthdate)+ INTERVAL AVG DATEDIFF( '1970-01-01'、birthdate)) 'はすべて約 –

+0

私はMySQLについてはわかりませんが、MS SQLの日付の束には' AVG'を得ることはできません。その行は、すべての生年月日の1970年以降の平均日数を取得し、追加します。私はちょうど私が1970年にそれらを加えるべきであることに気付きました、そして、 'MIN'ではなく、それを修正します。 –

+0

#Tom今はMIN(生年月日)がわかりません。 –

関連する問題