MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでGROUP BYとMIN()を使い、重複する値を持つ列ごとにタイムスタンプから最初の日付を取得する方法

このようなケースでは、集計関数 MIN()GROUP BY 句を組み合わせることで簡単に実現できます。まずはサンプル用のテーブルを作成しましょう。

mysql> create table DemoTable1870
    (
    Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    Value int,
    ShippingTimestamp varchar(100)
    );
Query OK, 0 rows affected (0.00 sec)

次に、INSERTコマンドを使ってテーブルにレコードを挿入します。ここでは、同じ「Value」の値を持つ複数のレコードに、異なるタイムスタンプを設定しています。

mysql> insert into DemoTable1870(Value,ShippingTimestamp) values(10,'1570645800');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1870(Value,ShippingTimestamp) values(10,'1546194600');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1870(Value,ShippingTimestamp) values(11,'1573324200');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1870(Value,ShippingTimestamp) values(11,'1557599400');
Query OK, 1 row affected (0.00 sec)

SELECT文ですべてのレコードを確認してみましょう。

mysql> select * from DemoTable1870;

上記のクエリを実行すると、次のような出力が得られます。

+----+-------+-------------------+
| Id | Value | ShippingTimestamp |
+----+-------+-------------------+
|  1 |    10 | 1570645800        |
|  2 |    10 | 1546194600        |
|  3 |    11 | 1573324200        |
|  4 |    11 | 1557599400        |
+----+-------+-------------------+
4 rows in set (0.00 sec)

テーブルを見ると、「Value = 10」と「Value = 11」それぞれに2件ずつのレコードが存在し、タイムスタンプが重複しています。ここで、Value列ごとにグループ化し、各グループ内で最も古いタイムスタンプ(最初の日付)を取得するクエリが以下になります。

mysql> select min(ShippingTimestamp) from DemoTable1870 group by Value;

実行結果は次のとおりです。

+------------------------+
| min(ShippingTimestamp) |
+------------------------+
| 1546194600             |
| 1557599400             |
+------------------------+
2 rows in set (0.00 sec)

補足:タイムスタンプを読みやすい日付形式に変換する

上記の値はUNIXタイムスタンプ形式のため、そのままでは日付として把握しづらい場合があります。FROM_UNIXTIME() 関数を組み合わせれば、人間が読める日時形式に変換できます。

mysql> select min(FROM_UNIXTIME(ShippingTimestamp)) as FirstDate 
       from DemoTable1870 group by Value;

これにより、各グループの最初の出荷日を直感的に確認できるようになります。なお、ShippingTimestamp 列はvarchar型で定義されていますが、数値として比較されるため正しく最小値が取得できます。より厳密な運用を行う場合は、INT型やDATETIME型でのカラム定義も検討するとよいでしょう。

  1. MySQLで列の値から先頭の1文字を取り出し、別の列に挿入する方法

    はじめにMySQLである列(カラム)の値から先頭の1文字を取り出し、それを別の列に格納したい場合があります。このようなときに便利なのが LEFT() 関数です。LEFT() 関数は、文字列の左端から指定した文字数だけを抽出することができます。ここでは、実際にテーブルを作成しながら、その手順を順番に解説していきます。1. テーブルを作成するまず、サンプル用のテーブルを作成しましょう。ここでは「FirstLetter」(先頭文字を格納する列)と「Title」(元となる文字列の列)の2つの列を持つテーブルを定義します。mysql> create table DemoTable2036 

  2. MySQLで値が「0」の場合に別の列から値を取得する方法

    MySQLで値が「0」の場合に別の列から値を取得する方法MySQLでは、IF()関数を使用することで、特定の列の値が「0」だった場合に、別の列の値を代わりに取得できます。条件分岐を1つのクエリ内で簡単に実現できる便利な関数です。IF()関数の基本構文select IF(yourColumnName1=0,yourColumnName2,yourColumnName1) as anyAliasName from yourTableName;この構文では、最初の列の値が「0」であれば2番目の列の値を返し、「0」以外であれば最初の列の値をそのまま返します。サンプルテーブルの作成まず、動作確認用のテー