2012-01-19 7 views
4

新しいシステムの統計に使用するために古いデータベースからユーザーを読み込む必要がありますが、元のユーザーテーブルはありません。しかし、毎年の合計を持つ統計表があり、必要なすべてのユーザー情報を見つけることもできます。加えて、これはまた、私が必要としているアクティブなユーザーだけを提供します。SQLの行を1列、別の列でグループ化する方法

テーブルには、次の関連する列があります(統計情報の列はここでは関係ありません)

  • ユーザーID
  • メール

を私はUserIDを区別したいので、それは唯一のcolです私がGROUP BYで持つことができる列。 最新の年の値を取得するために、MAXでYearを実行します。 FirstName、LastName、およびEmailは、MAX(Year)の行と同じである必要があります。言い換えれば、人々は何年もの間、名前と電子メールの両方を変更している可能性があります。そして、関連する唯一のものとして、最後のものだけを必要とします。 SQLクエリの

私の最高の提案は、このように書きます:

SELECT UserID, Firstname, LastName, Email, MAX(Year) AS Year 
FROM myTable 
GROUP BY UserID 
ORDER BY LastName, FirstName 

すべての列のような機能があることを持っているいずれかのために唯一の問題は、SQL Server 2008のは、私はそのようanyhingをやらせないということですMAXまたはGROUP BYの一部です。 FirstName、LastName、およびEmail列は、GROUP BYの下に置くことはできません。どうにかしてMAXをそれらのすべてに置くように働くようですが、MAX関数が実際に作業しているカラムを知る方法がありません。私はそれが問題になるかどうかはわかりませんが、実際に問題があるかどうかを調べるのに100 000行を調べる時間がありません。

つまり、MAXでは1つの列のみでGROUP BYは別の列で動作する5列の行全体が必要です。誰かが良い解決策を持っているのですか、またはグループ化していない行すべてでMAXを使用するのは実際に安全ですか?

答えて

13

いくつかの答え...


相関サブクエリ...

SELECT 
    * 
FROM 
    myTable 
WHERE 
    Year = (SELECT MAX(Year) FROM myTable AS lookup WHERE lookup.UserID = myTable.UserID) 


に参加派生集約...

SELECT 
    * 
FROM 
    myTable 
INNER JOIN 
    (SELECT UserID, MAX(Year) AS Year FROM myTable GROUP BY UserID) AS lookup 
    ON lookup.UserID = myTable.UserID 
    AND lookup.Year = myTable.Year 


順序CTE ROW_NUMBER()を使用しています...

WITH 
    sequenced_data AS 
(
    SELECT 
    ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY Year DESC) AS sequence_id, 
    * 
    FROM 
    myTable 
) 
SELECT 
    * 
FROM 
    sequenced_data 
WHERE 
    sequence_id = 1 
+0

2番目のクエリでサブクエリに 'GROUP BY UserID'が必要です。 –

+0

@ypercube - Ooops :)気が散った電話が私に気を散らした:) – MatBailie

+0

うわー、これはすばやい反応でした。皆さんのお返事ありがとうございます!私は1分で事務所から家に帰るだろうが、夕方に自宅から彼らを詳しく見る。 – bergenga

3

あなたはユーザーあたり1年のレコードしか持っていませんか? yesの場合は、old'n'good参加使用することができます:あなたは、新しいSQLのバージョンからの構文を使用することができます

SELECT m.UserID, m.Firstname, m.LastName, m.Email, m.Year 
FROM myTable m 
    INNER JOIN (
     SELECT UserID, MAX(Year) as Year 
     FROM myTable 
     GROUP BY UserID 
    ) x ON x.UserID=m.UserID and x.Year=m.Year 
ORDER BY m.LastName, m.FirstName 

確かに、私は古い(=より一般的な)の可能性に慣れてきた:)。

+1

私はこの答えがDems'sよりも優れている理由を理解していません。彼の答えはこれを含み、最初に答えた。 –

+0

@FlorinGhita - 入力を終える前にAvroが入力を開始していました。私は答えを提出するためにAvroをバッシュしません:)そして、um、ypercubeが指摘しなければならないタイプミスがありました* blush * – MatBailie

+0

Arvoが最初にこのクエリを投稿しました。 Demsは最初に相関バージョンを持っていて、他の2つが追加されました。 –