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

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

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

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

Q&A

1回答

8235閲覧

DATE型の日付とTIME型の時刻を結合してDATETIME型の日時が最新のレコードの取得

BrandNewMenu

総合スコア1

SQL

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

0グッド

1クリップ

投稿2021/01/04 14:11

DATE型の日付とTIME型の時刻を結合してDATETIME型の日時を算出し、その日時が最新のレコードを取得したいです。
日時がMAX()であるレコードを取得しようとしたのですが、下記の様に同じようなことを何回も書いてあるクエリになってしまいました。

テーブル定義

SQL

1CREATE TABLE test_table ( 2 date DATE, 3 time TIME, 4 group_name NVARCHAR(10), 5 value INT 6)

データ挿入

SQL

1INSERT INTO test_table( 2 date, 3 time, 4 group_name, 5 value 6)VALUES 7('2020-01-01', '10:00', 'groupA', 10), 8('2020-01-10', '11:00', 'groupA', 20), 9('2020-01-08', '15:00', 'groupA', 30), 10('2020-01-11', '12:00', 'groupA', 40), 11('2020-01-02', '10:00', 'groupB', 50), 12('2020-01-03', '13:00', 'groupB', 60)

group_nameがgroupAであり、かつ日時が最新のものを取得しようとすると下記になってしまいました。

SQL

1SELECT 2 date, 3 time, 4 group_name, 5 value, 6 datetime 7FROM 8( 9SELECT 10 date, 11 time, 12 group_name, 13 value, 14 CONVERT(DATETIME, CONVERT(NVARCHAR, date, 111) + ' ' + CONVERT(NVARCHAR, time, 108)) AS datetime 15FROM 16 test_table 17WHERE 18 group_name = 'groupA' 19) AS tmp_tbl1 20WHERE 21 datetime = (SELECT MAX(CONVERT(DATETIME, CONVERT(NVARCHAR, date, 111) + ' ' + CONVERT(NVARCHAR, time, 108))) 22 FROM 23 test_table 24 WHERE 25 group_name = 'groupA' 26 )

データベースはSQL Serverですが、MicrosoftのPower BIからアクセスしている関係上、SELECTしか使用できず、WITHなどは使えません。
WITHが使用できれば下記の様にできると思っています。

SQL

1WITH sub_query AS ( 2SELECT 3 date, 4 time, 5 group_name, 6 value, 7 CONVERT(DATETIME, CONVERT(NVARCHAR, date, 111) + ' ' + CONVERT(NVARCHAR, time, 108)) AS datetime 8FROM 9 test_table 10WHERE 11 group_name = 'groupA' 12) 13 14SELECT 15 date, 16 time, 17 group_name, 18 value, 19 datetime 20FROM 21 sub_query 22WHERE 23 datetime = (SELECT MAX(datetime) FROM sub_query)

SELECTのみでも、加工した列の最大値のレコードの取得について、もっとスマートな記載はできないでしょうか?

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

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

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

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

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

guest

回答1

0

Window関数を使用するのが一番簡潔な記述になるかと思います。
ROW_NUMBER()DENSE_RANK()を用います。

SQL

1select * 2from ( 3 SELECT * 4 , row_number() over(order by date desc, time desc) AS seq 5 FROM test_table 6 WHERE group_name = 'groupA' 7) t1 8where seq=1

投稿2021/01/05 03:00

編集2021/01/05 03:38
sazi

総合スコア25327

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

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

BrandNewMenu

2021/01/05 15:14

ありがとうございます。 もし最大のものが複数存在していた場合に、それらをすべて表示したい場合はどうすれば良いでしょうか?
sazi

2021/01/05 15:47

RANK()を使用します。RANKは同位は同じ数字になるので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問