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

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

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

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

3回答

6355閲覧

SQLserverにてid毎の最新レコード取得SQLについて

yui_sarasina

総合スコア15

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2016/06/29 04:08

以下の様なテーブルに対してユーザ毎にlogintimeが最新のレコードを取得するSQLを作成しています。
最新レコードを対象とした記述に苦戦しているため、ご教示ください。

現在のSQLの原因として以下の点があると思います。
・selectのmaxはlogintimeの最新レコードではなく
グループ化されたuser_idの各カラム毎に最大値を取得している
・gorup byの結果に対してorder byを行っているので
最新レコードでの一意のグループ化が行われていない

↓ 現在作成中のSQL
select
user_id,
max(group_id) group_id,
max(logintime) logintime
from histories
group by user_id
order by logintime desc

↓ 対象のTBL
histories.tbl
~~~~~~~~~~~~~~~~
user_id group_id logintime
~~~~~~~~~~~~~~~~
1 2 12:00
1 1 15:00
2 1 16:00
3 1 17:00

↓ 期待する結果
~~~~~~~~~~~~~~~~
user_id group_id logintime
~~~~~~~~~~~~~~~~
1 1 15:00
2 1 16:00
3 1 17:00

↓現在の結果
~~~~~~~~~~~~~~~~
user_id group_id logintime
~~~~~~~~~~~~~~~~
1 2 15:00
2 1 16:00
3 1 17:00

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

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

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

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

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

guest

回答3

0

SQLServerの分析関数の使用例の「4. 最大値の行の取得」
https://oraclesqlpuzzle.ninja-web.net/sqlserver2008-sql1-olap.html#1-4
を見ながら、Oracle11gR2で作ってみました :-)

sql

1with t(user_id,group_id,logintime) as( 2select 1,2,'12:00' from dual union 3select 1,1,'15:00' from dual union 4select 2,1,'16:00' from dual union 5select 3,1,'17:00' from dual), 6tmp as( 7select user_id,group_id,logintime, 8max(logintime) over(partition by user_id) as MaxLogintime 9 from t) 10select user_id,group_id,logintime 11 from tmp 12 where logintime = MaxLogintime 13order by user_id; 14 15USER_ID GROUP_ID logintime 16------- --------- --------- 17 1 1 15:00 18 2 1 16:00 19 3 1 17:00

投稿2016/07/02 09:45

編集2019/03/12 06:33
AketiJyuuzou

総合スコア1147

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

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

Zuishin

2016/07/02 10:08

これもしかして 24 時間 24×60(×60(×100)) 分書くんですか?
guest

0

ベストアンサー

これでどうですか?

SQL

1select * from histories h1 where logintime=(select max(logintime) from histories h2 where h1.user_id = h2.user_id) order by logintime

投稿2016/06/29 04:36

Zuishin

総合スコア28660

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

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

yui_sarasina

2016/06/30 02:10

ご回答ありがとうございます。 投稿後に試行錯誤した結果、頂いたSQLと同様の書き方に至りました。 今回はこちらの書き方で進めたいと思います。
guest

0

目的が、

テーブルに対してユーザ毎にlogintimeが最新のレコードを取得するSQL

であれば、自身で出来る様になるまでは、簡単な処でまずは済まして、
集合を含めたSQLの学習を行います。
1.先ずは目的に応じたデータの種類のビューを作ります。
⇒元のテーブルから、ユーザー毎のビューを作る
2.1.で作成したビューに対して、logintimeの最新を取得する。
⇒当座は、この結果を、ユーザー順にくっつけて運用すれば、事足りる筈です。
(UNION 集合演算子)
3.学習結果を基に、元テーブルからユーザー毎の現在行いたいことを試行錯誤します。
⇒ユーザー数などは多くなりがちなので、個別にビューを作ったりしないでを
期待しますが、出来ない間は無理をしないで、
目的の内容が含まれる、ビューを作り、そこから抽出する方が簡単です。
複数のビューで作られた集合が、ユーザー毎のデータの集合なのですから。

MS SQL Server 自習書
で、検索されると、MS-SQL Server のマイクロソフト版の自習書が検索できます。
ミック リレーショナル・データベースの世界
ミック氏のサイトが検索できます、一度は目を通して方が良いかも。

投稿2016/06/29 04:26

編集2016/06/29 04:34
daive

総合スコア2028

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

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

yui_sarasina

2016/06/30 02:09

丁寧なご説明ありがとうございます。 1つ1つ順番に進めていくことと MS SQL Server 自習書を検索して勉強したいと思います。
daive

2016/07/02 22:59

少し余裕が出来たら、 Visual Studio LightSwitch https://msdn.microsoft.com/ja-jp/library/ff851953.aspx を学習してみてください。VS2010~ で使用可能な簡易言語的機能です。 テーブルが完成していれば、コードレスで(コードを書く事も可能) データベースのデータ表示、編集機能が簡単に作成可能です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問