2017-04-19 8 views
2

ごとに最大値を取得します。私は、テーブルから名前のグループごとに1つの行を維持する必要があります。グループ

ID | Name | Attribute1| Attribute2 | Attribute3 
1 | john | true  | 2012-20-10 | 12345670 
2 | john | false  | 2015-20-10 | 12345671 
3 | james | false  | 2010-02-01 | 12345672 
4 | james | false  | 2010-02-03 | 12345673 
5 | james | false  | 2010-02-06 | 12345674 
6 | sara | true  | 2011-02-02 | 12345675 
7 | sara | true  | 2011-02-02 | 12345676 

...指定した基準に従って。最初に、Attribute1(存在する場合)、最大の日付(Attribute2)、およびそれが1つの行に結果でない場合は、Attribute1がtrueの保持された行が必要です。

ID|Name|Attribute1|Attribute2|Attribute3 
1 | john | true | 2012-20-10 | 12345670 
5 | james | false | 2010-02-06 | 12345674 
7 | sara | true | 2011-02-02 | 12345676 

は私が入れ子になって参加することを実行しようとしましたが、それは非常に複雑であるように思わ:

望ましい結果です。 - いない場合は、いくつかのグローバルで(とキャッシュ名を維持

CREATE TABLE output AS 
SELECT 
    ID, 
    Name, 
    Attribute1, 
    Attribute2, 
    Attribute3 
FROM input 
ORDER BY 
    Name, 
    Attribute1 DESC, 
    Attribute2 DESC, 
    Attribute3 DESC; 

、各行に対してループを行うと名前が前に発生したかどうかをチェックし、キャッシュ: 一部単にソリューションは、最初に、ORDER BYのSQLの結果を行うことです変数)、それ以外の行を削除します。

純粋なSQLソリューションはありますか? PostgreSQLの

+0

"最初の場所で*はATTRIBUTE1 *で真との行に保存されなければならない" - 偽 'attribute1の=との行がありますので、ご希望の結果と矛盾します' –

+0

@a_horse_with_no_name私は、postgresqlをインストールする必要なしに簡単な解決策が必要でしたので、sqliteを使い始めましたが、最終的にはどのデータベースでも構いません。グループのすべての行がAttribute1にfalseを持っていても、何かをグループから取得する必要がありますが、Attribute2とAttribute3に基づいているため、attribute1 = trueにすることはできません。 – erhesto

+3

使用するDBMSを決定する必要があります。この種のクエリは、データベースエンジンの機能によって非常に異なります –

答えて