MySQLでテーブルの日時(DATETIME)列から重複のない日付を抽出する方法
MySQLのテーブルに保存された日時(DATETIME)型のデータから、重複のない日付だけを取り出したいケースはよくあります。そんなときはDISTINCTキーワードを使うことで、簡単に一意な日付の一覧を取得できます。
この記事では、実際にテーブルを作成しながら、日時列から個別の日付を抽出する手順をわかりやすく解説します。
1. サンプルテーブルの作成
まずは、投稿メッセージを管理するためのテーブルを作成しましょう。次のSQLを実行します。
mysql> create table PostMesssageDemo
-> (
-> UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> UserMessage varchar(100),
-> UserPost datetime
-> );
Query OK, 0 rows affected (0.60 sec)このテーブルには、ユーザーID(UserId)、メッセージ内容(UserMessage)、投稿日時(UserPost)の3つのカラムが定義されています。
2. テストデータの挿入
続いて、INSERT文を使っていくつかのレコードを登録します。now()関数やdate_add()関数を使うことで、現在日時やそれに一定期間を加えた日時を簡単に挿入できます。
mysql> insert into PostMesssageDemo(UserMessage,UserPost) values('Software Developer',now());
Query OK, 1 row affected (0.17 sec)
mysql> insert into PostMesssageDemo(UserMessage,UserPost) values('Software Developer',date_add(now(),interval 3 month));
Query OK, 1 row affected (0.16 sec)
mysql> insert into PostMesssageDemo(UserMessage,UserPost) values('Software Developer',now());
Query OK, 1 row affected (0.12 sec)
mysql> insert into PostMesssageDemo(UserMessage,UserPost) values('Software Developer','2019-03-31 17:30:34');
Query OK, 1 row affected (0.10 sec)3. 登録されたレコードの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from PostMesssageDemo;
実行結果は以下の通りです。
+--------+--------------------+---------------------+ | UserId | UserMessage | UserPost | +--------+--------------------+---------------------+ | 1 | Software Developer | 2019-02-15 18:07:27 | | 2 | Software Developer | 2019-05-15 18:09:18 | | 3 | Software Developer | 2019-02-15 18:09:31 | | 4 | Software Developer | 2019-03-31 17:30:34 | +--------+--------------------+---------------------+ 4 rows in set (0.00 sec)
ご覧のとおり、1件目と3件目は同じ「2019年2月15日」に投稿されています。ここから重複を除いた日付だけを取り出すのが今回の目的です。
4. DISTINCTで重複のない日付を取得する
DATETIME型は時刻情報まで含むため、そのままDISTINCTを使っても同じ日でも時刻が異なるレコードは別々に扱われてしまいます。そこで、year()関数とmonth()関数で年月だけを取り出し、それに対してDISTINCTを適用します。
mysql> select distinct year(UserPost),month(UserPost) from PostMesssageDemo;
実行結果は以下のようになります。
+----------------+-----------------+ | year(UserPost) | month(UserPost) | +----------------+-----------------+ | 2019 | 2 | | 2019 | 5 | | 2019 | 3 | +----------------+-----------------+ 3 rows in set (0.00 sec)
このように、重複していた2019年2月が1行にまとめられ、「2019年2月」「2019年5月」「2019年3月」という3つの一意な年月が取得できました。
まとめ
DATETIME列から重複のない日付を抽出するポイントは以下の2つです。
- DISTINCTキーワードを使って重複行を排除する
- year()やmonth()、day()などの関数で必要な単位(年・月・日)に切り出してからDISTINCTを適用する
日単位で抽出したい場合は「date(UserPost)」を使えば、時刻を無視した日付単位の一意なリストも簡単に取得できます。ログ分析や集計処理などでぜひ活用してください。
-
MySQLでテーブルの重複を除いたレコードから平均値を取得するクエリの書き方
MySQLで平均値を求めるには AVG() 関数を使用します。さらに DISTINCT と組み合わせることで、重複しているレコードを除外した状態で平均を計算することができます。この記事では、実際にサンプルテーブルを作成しながら、個別(ユニーク)なレコードから平均値を取得する方法を解説します。サンプルテーブルの作成まず、以下のクエリでテーブルを作成します。mysql> create table DemoTable1934 ( StudentName varchar(20), StudentMarks int ); Query OK, 0 rows affec
-
MySQLで値が「0」の場合に別の列から値を取得する方法
MySQLで値が「0」の場合に別の列から値を取得する方法MySQLでは、IF()関数を使用することで、特定の列の値が「0」だった場合に、別の列の値を代わりに取得できます。条件分岐を1つのクエリ内で簡単に実現できる便利な関数です。IF()関数の基本構文select IF(yourColumnName1=0,yourColumnName2,yourColumnName1) as anyAliasName from yourTableName;この構文では、最初の列の値が「0」であれば2番目の列の値を返し、「0」以外であれば最初の列の値をそのまま返します。サンプルテーブルの作成まず、動作確認用のテー