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

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

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

Power BIは、マイクロソフト社が提供しているBIツールです。レポートの作成・共有、エクセルや会計システムなどさまざまなソフトウエアのデータをグラフやチャートに変換。データの分析・解析などにも利用できます。

SQL

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

Amazon Redshift

Amazon Redshiftは、Amazon社が提供する 高速かつ完全マネージド型でペタバイト規模の クラウドデータウェアハウスサービスです。

Q&A

解決済

1回答

823閲覧

SQL:条件付き最大値の抽出が途中で途切れてしまう。

PauT

総合スコア1

Power BI

Power BIは、マイクロソフト社が提供しているBIツールです。レポートの作成・共有、エクセルや会計システムなどさまざまなソフトウエアのデータをグラフやチャートに変換。データの分析・解析などにも利用できます。

SQL

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

Amazon Redshift

Amazon Redshiftは、Amazon社が提供する 高速かつ完全マネージド型でペタバイト規模の クラウドデータウェアハウスサービスです。

0グッド

0クリップ

投稿2021/07/28 09:53

編集2021/07/28 14:07

##やりたいこと
以下のようなデータをSQLで抽出すること。

◆作りたいデータ(要点抜粋)

ID基準日入力日入力データ
1011/112/30A
1011/812/30A
1011/151/12B
1011/221/12B
1011/291/29C
1021/112/27D
1021/81/4E
1021/151/4E
1021/221/22F
1021/291/22F

上記を構成する元データは以下のような形である。
◆元データ(要点抜粋)

ID入力日入力データ
10112/30A
1011/12B
1011/29C
10212/27D
1021/4E
1021/22F

◆カレンダー(追記しました)

日付曜日
1/1
1/2
1/3
1/4
1/5
1/6

以降省略

つまり要件としては、
・基準日以前で最も新しい入力日
・その際の入力データ
の2点を、基準日ごとに抽出することである。

※基準日について
・毎週金曜日を基準日として考える。
・基準日はカレンダーのデータベースから取得する。
・毎週の入力日について、金曜日にチェックできるようにする。
・基準日ごとに最新の入力日と入力データを取得する。

##うまくいかないポイント
以下のようなSQLを記載したが、データが途中で途切れてしまう。

select ID,入力日,入力データ,カレンダー.日付 --「元データ」は省略します from 元データ a1 cross join カレンダー join( select ID,MAX(入力日) from 元データ group by ID) a2 on a1.ID=a2.ID and a1.入力日=a2.入力日 where カレンダー.曜日 = 金 and a1.入力日 <= カレンダー.日付

出力されるデータは以下のような形である。

ID基準日入力日入力データ
1011/151/12B
1011/221/12B
1011/291/29C
1021/81/4E
1021/151/4E
1021/221/22F
1021/291/22F

##質問
・データが途切れる要因は何か
→ものによって途切れる場所が異なる。
→nullはなし。
・改善するために必要な句・ポイントは何か

##環境
Windows10
Amazon Reshift
PowerBI
以上で発生。

以上です。
初学者なので根本的に理解が及んでいない点があるかもしれないですが、要点ご教授いただけると助かります。
よろしくお願いいたします。

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

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

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

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

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

neko_the_shadow

2021/07/28 10:28

基準日というのはどこから出てきていますか?
PauT

2021/07/28 10:35

情報不足申し訳ございません。 カレンダーから曜日を指定して引っ張ってきています。 質問内に追記しました。
odataiki

2021/07/28 12:46

すみません。カレンダーは見ましたが 基準日がどういう意味なのか咀嚼できていません。 基準日について解説お願いできますか?
PauT

2021/07/28 13:32

基準日について説明を追記いたしました。 基準日は毎週金曜とし、ウィークリーで最新の入力日・入力データを取得したいと考えています。
odataiki

2021/07/28 13:44

なるほど。言い換えると 土曜日始まりの1週間だとして 週末(金曜日)時点での最新入力日とその入力データを一覧したい、ということですね。
PauT

2021/07/28 13:47

おっしゃるとおりです! また、一部コード抜けがありましたので修正しました。
odataiki

2021/07/28 14:00

開示頂いたSQLを実行してみましたが、「GROUP BY句にIDが含まれていません」(a2のサブクエリ部分) など色々構文エラーが出て出力される形にならないのですが・・・ 実際に書かれているSQL文は開示かのうですか?
PauT

2021/07/28 14:08

GROUP BY句が抜けていました。大変申し訳ありません。 一部修正しましたが、もしかしたら別のエラーも出てしまうかもですね。。 社用PCが時間的に起動できないため、明日実際のSQL文を記載するようにします。 よろしくお願いいたします。
guest

回答1

0

ベストアンサー

RANK関数を利用するとよいかと思います。

SQL

1SELECT S.ID, S.基準日, S.入力日, S.入力データ 2FROM ( 3 SELECT 4 T.ID, C.日付, T.入力日, T.入力データ, 5 RANK() OVER (PARTITION BY T.ID, C.日付 ORDER BY T.入力日 DESC) 6 FROM カレンダー C 7 JOIN 元データ T ON T.入力日 <= C.日付 8 WHERE C.曜日 = '金' 9) S (ID, 基準日, 入力日, 入力データ, ランク) 10WHERE ランク = 1

投稿2021/07/28 15:06

neko_the_shadow

総合スコア2230

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

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

PauT

2021/07/28 15:33

ありがとうございます! 思いつかなかった構造なので、明日試してみます。 うまくいかなかったら、またご相談させてください!
PauT

2021/07/29 03:56

先ほど実施してみたところ、無事欲しかったデータを取ることができました! MAXだとできなかったのに…不思議です! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問