以下の(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ランキング
-
一つ前に戻るには…
-
複数の列にまたがってユニーク...
-
SQLです!!教えてください。
-
Accessでデータシートに同じデ...
-
L2SWはARPテーブルを持っている?
-
Accessのテーブルデータを一気...
-
accessでレコード更新直後の反...
-
処理の途中で停止させ、再開さ...
-
同一テーブルのデータを参照し...
-
SQL 複数テーブルのupdate
-
テーブル名をカラムとして取得...
-
テーブルで一番古いレコードだ...
-
トリガって、自分自身のテーブ...
-
SQL、2つのテーブルで条件一致...
-
SQLにて指定日付より前、かつ最...
-
男性と2人で飲食店に行きテーブ...
-
このテーブルで
-
結合テーブルでINSERTする方法...
-
LONG型の先頭250バイトを Varch...
-
会社の飲み会の幹事になり、座...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
一つ前に戻るには…
-
mysqlのフィールド名
-
最大値を持つレコードを削除したい
-
mysqlでJOIN文
-
1列について重複行を除いて全列...
-
グループからランダムに抽出す...
-
mysqlで外部キーをつけたカラム...
-
SQL一発でカレンダー表示は可能...
-
矛盾していないでしょうか?
-
ビューに追加・削除が出来ません。
-
1000万件のデータをmysqlで効率...
-
テーブルが作成できない
-
挿入先テーブルに存在しないレ...
-
【ストアドプロシージャ】条件...
-
SQL内でループさせるような検索文
-
MySQL INSERT文 エラー
-
mysqlのデータベースを復元した...
-
Waiting for table lockエラー...
-
PHP上のSQLで、SELECT文をいく...
-
複数の列にまたがってユニーク...
おすすめ情報