-5

編集:以下のコメントの @MostyMostacho によると、これはプレーンな SQL では実行できません。他の人に役立つ可能性がある場合に備えて、質問を開いたままにします。

私はこのテーブルを持っています:

+---+---+
| a | b |
+---+---+
| 1 | J |
+---+---+
| 4 | A |
+---+---+
| 1 | A |
+---+---+
| 6 | A |
+---+---+
| 7 | A |
+---+---+
| 3 | A |
+---+---+
| 5 | A |
+---+---+
| 3 | P |
+---+---+
| 4 | P |
+---+---+
| 1 | P |
+---+---+
| 5 | P |
+---+---+
| 6 | P |
+---+---+
| 7 | P |
+---+---+

そして、私はこの結果が欲しいです:

+---+---+
| a | b |
+---+---+
| 1 | J |
+---+---+
| 4 | A |
+---+---+
| 6 | A |
+---+---+
| 7 | A |
+---+---+
| 3 | A |
+---+---+
| 5 | A |
+---+---+

a最初に出現した行を保持し、後続の行を破棄したいと考えています。

それを達成するには、どのクエリを実行する必要がありますか? 私のSQLスキルは錆びてきています...

4

3 に答える 3

1

これを試して:

SELECT T1.*
FROM myTable T1
WHERE NOT EXISTS(
   SELECT 'NEXT'
   FROM myTable T2
   WHERE T2.a = T1.a
   AND T2.b > T1.a
)

存在しないサブクエリは最後だけを取得します。注文は列 B の ASC 値によって条件付けられていると思います

于 2013-10-10T16:06:46.733 に答える
0
SELECT a.A, a.B
FROM (select @rownum:=@rownum+1 as id, a, b FROM table, (SELECT @rownum:=0) r  ) a
INNER JOIN (
    SELECT MIN(id) id
    FROM (select @rownum:=@rownum+1 as id, a, b FROM table, (SELECT @rownum:=0) r  )
    GROUP BY A
) b ON b.id = a.id
于 2013-10-10T16:05:57.427 に答える
0

特定のタイムスタンプまたは単調に増加する id 列がなければ、テーブル内の行が挿入された順序でクエリを実行する方法はありません。データベース エンジンは任意の任意の順序で自由に行を返すことができますが、これは行が入った順序ではない場合があります。

したがって、あなたが提案したことは、あなたが提供したテーブル スキーマを持つほとんどの RDBMS では実際には不可能です。


ただし、次の表があるとします。

+------+-------+-------+
| | ID | あ | ビ |
+------+-------+-------+
| | 1 | 1 | z |
| | 2 | 1 | y |
| | 3 | 1 | × |
| | 4 | 2 | y |
| | 5 | 2 | × |
| | 6 | 3 | × |
+------+-------+-------+

あなたがすることができます:

SELECT a.A, a.B
FROM Table1 a
INNER JOIN (
    SELECT MIN(id) id
    FROM Table1
    GROUP BY A
) b ON b.id = a.id

SQL フィドルのデモ

于 2013-10-10T16:01:12.270 に答える