8

次の表を想定します。

Name             SubName        Message    Time
USA             MA              M1         1
USA             NY              M2         2
USA             WA              M3         3
USA             MA              M4         4
USA             WA              M5         5
USA             NY              M6         6
FIN             HEL             M7         7
FIN             TAM             M8         8
FIN             HEL             M9         9

以下を返す SQL クエリが必要です。

Name             SubName        Message    Time
FIN              HEL            M9         9
FIN              TAM            M8         8
USA              NY             M6         6
USA              WA             M5         5
USA              MA             M4         4

これはORDER BY time DESC、個別の名前でグループ化され、個別のサブネームでサブグループ化されます。

これは可能ですか?DBMS 固有ではないソリューション、つまりほとんどすべての DBMS で実行できるソリューションを探しています。

4

6 に答える 6

5
SELECT * FROM 
#TEMP T1 WHERE TIME=
(SELECT MAX(TIME) FROM #TEMP T2
WHERE T1.NAME=T2.NAME AND T2.SUBNAME=T1.SUBNAME)

Output:

Name    SubName Message Time
USA       WA    M5       5
USA       NY    M6       6
USA       MA    M4       4
FIN       TAM   M8       8
FIN       HEl   M9       9
于 2016-08-10T13:09:36.450 に答える
4

また、dbms が ANSI SQL の拡張機能 T611 をサポートしていない場合、基本的な OLAP 操作:

select t1.*
from tablename t1
  join (select name, subname, max(Time) maxtime
        from tablename
        group by name, subname)
   on t1.name = t2.name and
      t1.subname = t2.subname and
      t1.time= t2.maxtime
order by name, subname, time desc

コア SQL-2003 以外の次の機能が使用されています: F591、「派生テーブル」

ANSI SQL にはtime予約語があるため、 として区切る必要がある場合があることに注意してください"time"

于 2016-08-10T13:11:29.033 に答える
1

私はこれをテストしていませんが、これはうまくいくと思います:

select
    t1.name as name,
    t1.subname as subname,
    (select max(t2.message) from table t2 where t2.name = t1.name and t2.subname = t1.subname) as message,
    (select max(t2.time) from table t2 where t2.name = t1.name and t2.subname = t1.subname) as time
from
    table t1
group by
    t1.name,
    t1.subname
order by
    t1.name
于 2016-08-10T17:55:00.003 に答える