![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
以下の(1)のようなデータがあった場合、一つのSQL文で(3)の表が
取得できる方法はございますでしょうか?
(1)table T_SAMPLE
|UID| FLAG|CREATE_DATE|
------------------------------------------------
|000|A|2009-01-26 00:00:00|★
|000|A|2009-01-26 00:00:10|
|000|B|2009-01-26 00:00:20|
|002|A|2009-01-26 00:00:05|★
|002|B|2009-01-26 00:00:13|
|002|A|2009-01-26 00:01:00|
|002|B|2009-01-26 00:02:02|
|003|B|2009-01-26 00:05:00|★
|004|B|2009-01-26 00:00:00|★
|004|B|2009-01-26 00:00:15|
|004|A|2009-01-26 01:00:00|
|005|B|2009-01-26 00:00:11|★
|005|B|2009-01-26 00:04:05|
(2)同じUIDがあった場合、CREATE_DATEが早い情報(上表★)を使用
|UID| FLAG|CREATE_DATE|
---------------------------------------------------
|000|A|2009-01-26 00:00:00|★
|002|A|2009-01-26 00:00:05|★
|003|B|2009-01-26 00:05:00|★
|004|B|2009-01-26 00:00:00|★
|005|B|2009-01-26 00:00:11|★
(3)FLAGでカウント<= 取得したい結果
|COUNT(FLAG)| FLAG|
--------------------------------
|2| A|
|3| B|
イメージとしては、
[処理a]
select FLAG from T_SAMPLE where UID = '000' order by CREATE_DATE limit 0,1
×それぞれUID
とすると、上記(1)→(2)で
select UID,[処理aの結果においてUIDに対応したFLAG] from T_SAMPLE group by UID
という状態の結果が一度のSQLで取得できればよいと考えているのですが。
実際にこの処理を実施する際は、自由に指定されるCREATE_DATEの範囲で絞り込むため、別テーブルを作って、、、等の処理は避けたいのです。
最適な方法がございましたら、なにとぞご教示願います。
No.2ベストアンサー
- 回答日時:
今MySQLの環境がないのでSQL Serverでしか試してませんが、これでどうでしょう?
4.1でサブクエリが実装されてるということなので、動くと思うのですが・・・
SELECT
COUNT(*)
, flag
FROM
T_Sample A
WHERE
NOT EXISTS(
SELECT * FROM T_Sample B
WHERE A.uid = B.uid AND
B.create_date < A.create_date
)
GROUP BY
flag
;
SELECT
COUNT(*)
, flag
FROM
T_Sample A
WHERE
A.create_date =
(SELECT MIN(B.create_date) FROM T_Sample B
WHERE A.uid = B.uid)
GROUP BY
flag
;
下のSQL文が、まさに想像していた形です!
なるほど、このように書くのですね。
大変勉強になりました。
上のSQL文は、結果が少々違いました。
NOT EXISTSに関して自分が全く無知なので、これから調べてみます。
お礼が遅くなってすみません。
本当にありがとうございました!
No.3
- 回答日時:
これでよいのでは?
SELECT COUNT(FLAG) AS COUNT , FLAG FROM T_SAMPLE
INNER JOIN (
SELECT UID,MIN(CREATE_DATE) AS CREATE_DATE
FROM T_SAMPLE GROUP BY UID
) AS T2
ON T_SAMPLE.UID=T2.UID AND T_SAMPLE.CREATE_DATE=T2.CREATE_DATE
GROUP BY FLAG
本当だ、このようにしても得られますね!
気づきませんでした。
つくづくSQLってパズルみたいだなって思います。
もっと柔軟な思考が大切ですね。
大変勉強になりました。
本当にありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- PHP PHP MySql ページング 2 2022/09/20 06:38
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
一つ前に戻るには…
-
外部キー、親を調べるにはshow ...
-
MySQLのテーブルタイプの変更に...
-
Accessでデータシートに同じデ...
-
SQLでSUMなどの関数でデータが...
-
update文で改行を入れる
-
L2SWはARPテーブルを持っている?
-
飲み会で、座敷orテーブルどち...
-
sqlplusで表示が変なので、出力...
-
SQL、2つのテーブルで条件一致...
-
テーブル名をカラムとして取得...
-
ROWNUMでUPDATEをしたいのです...
-
SELECT 文の NULL列は?
-
他のデータベースとのテーブル結合
-
まるいテーブル 円い 丸い 漢字...
-
UPDATE文の更新順序について
-
SQLで違うテーブルの値を比較し...
-
会社の飲み会の幹事になり、座...
-
ビューのソートについて
-
2台のサーバー間でのテーブル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
一つ前に戻るには…
-
ビューに追加・削除が出来ません。
-
最大値を持つレコードを削除したい
-
mysqlでJOIN文
-
SQL文による残業時間の算出につ...
-
mysqlのフィールド名
-
SQL一発でカレンダー表示は可能...
-
矛盾していないでしょうか?
-
1列について重複行を除いて全列...
-
副問い合わせの限界値はどれく...
-
mysqlで外部キーをつけたカラム...
-
MySQLのFOREIGN KEYについて
-
MySQLのテーブル設計について
-
PHP上のSQLで、SELECT文をいく...
-
SQLを教えてください
-
char型データ 固定長のままでs...
-
【ストアドプロシージャ】条件...
-
グループからランダムに抽出す...
-
売上管理
-
他のDBにあるテーブル内容をcre...
おすすめ情報