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のみでも、加工した列の最大値のレコードの取得について、もっとスマートな記載はできないでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/05 15:14
2021/01/05 15:47