質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

3回答

170閲覧

【SQL】同一行あるうち作成日が古い方を抽出したい

pecchan

総合スコア555

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2019/04/02 04:22

編集2019/04/02 04:45

mariadb 5.5.52です。

以下のような毎月、社員ごと行が作成されるサマリテーブルがあります。

id | employee_id | wk_month| created_at
1 | 1 | 2019/03 | 2019-02-22 08:34:56
2 | 1 | 2019/03 | 2019-03-18 18:23:52
3 | 2 | 2019/03 | 2019-02-22 08:34:56
4 | 3 | 2019/03 | 2019-02-22 08:34:56
5 | 4 | 2019/03 | 2019-02-22 08:34:56
6 | 4 | 2019/03 | 2019-03-15 12:11:11

上記のうち、以下のような、
同一社員行で2行以上あるもの、かつ、作成日(created_at)が古い方を抽出したいです。
同月に1行しかないid=3、id=4は抽出したくありません。
id | employee_id | wk_month| created_at
1 | 1 | 2019/03 | 2019-02-22 08:34:56
5 | 4 | 2019/03 | 2019-02-22 08:34:56

とりあえず同一社員で、同月に複数行があるものを抽出するところまでは出来ました

sql

1select * from wk_sums 2where wk_month='201903' 3group by employee_id 4having count(employee_id) > 1 5order by employee_id

これ以降のクエリが分かりません。
分かる方宜しくお願い致します。

---同日追加
作成日(created_at)は、datatime型です

---同日修正
例を修正

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

macaron_xxx

2019/04/02 04:25

作成日が新しいほうですよね…?
pecchan

2019/04/02 04:28

macaron_xxx様 有難う御座います。 いえ、古い方を抽出したいです。
macaron_xxx

2019/04/02 04:28

本文中の例が間違っていますか?
pecchan

2019/04/02 04:29

例が間違いです。失礼しました。 修正します。
guest

回答3

0

ベストアンサー

group byでmin(created_at)を取ってきて、それと一致する行だけ取り出したらどうでしょうか
(実行してないのでエラー出たらすいません)

select wk_sums.id, wk_sums.employee_id from ( select id, min(created_at) as min_create_at from wk_sums where wk_month='201903' group by employee_id having count(employee_id) > 1 ) t, wk_sums where wk_sums.id = t.id and wk_sums.crated_at = t.min_create_at

投稿2019/04/02 04:41

izmktr

総合スコア2856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pecchan

2019/04/02 04:59

有難う御座います。 crated_at -> created_at だけ直したら実行でき、抽出できました! 有難う御座いました!
guest

0

  • 元データ

SQL

1create table tbl( 2id int primary key, 3employee_id int, 4wk_month char(7), 5created_at datetime 6); 7insert into tbl values 8(1,1,'2019/03','2019-02-22 08:34:56'), 9(2,1,'2019/03','2019-03-18 18:23:52'), 10(3,2,'2019/03','2019-02-22 08:34:56'), 11(4,2,'2019/03','2019-03-20 18:48:18'), 12(5,3,'2019/03','2019-03-10 01:00:00'), 13(6,3,'2019/03','2019-03-01 02:00:00'), 14(7,3,'2019/03','2019-03-20 03:00:00'), 15(8,3,'2019/02','2019-02-01 04:00:00'), 16(9,4,'2019/03','2019-04-01 05:00:00'), 17(10,5,'2019/03','2019-04-02 06:00:00');

※insertデータを調整

  • 抽出

SQL

1select * from tbl as t1 2where not exists 3( select 1 from tbl 4where employee_id=t1.employee_id 5and wk_month=t1.wk_month 6and created_at<t1.created_at) 7and wk_month='2019/03'

2行以上あるデータのみ

SQL

1select * from tbl as t1 2where not exists 3(select 1 from tbl 4where employee_id=t1.employee_id 5and wk_month=t1.wk_month 6and created_at<t1.created_at 7) 8and exists 9(select 1 from tbl 10where employee_id=t1.employee_id 11and wk_month=t1.wk_month 12having count(*)>1 13) 14and wk_month='2019/03'

投稿2019/04/02 04:37

編集2019/04/02 05:05
yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pecchan

2019/04/02 04:55

有難う御座います。 このうち、同一月に同一社員で2行以上あるものだけ取得は可能でしょうか?
yambejp

2019/04/02 05:05

追記しておきました
guest

0

sql

1SELECT 2 * 3FROM 4 wk_sums M 5WHERE 6 NOT EXISTS ( 7 SELECT 1 FROM wk_sums EX 8 WHERE EX.employee_id = M.employee_id 9 AND EX.created_at < M.created_at 10 )

投稿2019/04/02 04:36

編集2019/04/02 04:36
macaron_xxx

総合スコア3191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pecchan

2019/04/02 04:53

有難う御座います。 該当月(2019/03)以外も抽出されちゃいました
macaron_xxx

2019/04/02 07:00

>該当月(2019/03)以外も抽出されちゃいました ここは条件「同一社員行で2行以上あるもの、かつ、作成日(created_at)が古い方を抽出したいです。」になかったので、省いています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問