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

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

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

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

SQL

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

Q&A

解決済

2回答

658閲覧

【SQL全般】SQLを使って条件に一致した1つ前のレコードを収集したい。

musyoku

総合スコア3

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

SQL

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

0グッド

0クリップ

投稿2022/12/02 06:54

編集2022/12/02 07:28

前提

Google Apps Script(GAS)を使ってます。GASのQuery関数を使ってシートにあるデータから意図するレコードを抜き出したいです。ただ聞きたい事は一般的なSQL文の作り方の話なのでGASのQuery関数をSQLServerなど通常のSQLでの話と捉えて大丈夫です。

実現したいこと

「num列が2以上の場合その1つ前のレコードを抽出したい」

下記の例だとidが4と5のnumが2以上なのでidが3と4のレコードを取得したいです。
※先頭はカラム名です。

id/name/num
1/AAA/2.1
2/BBB/1.8
3/CCC/1.5
4/DDD/2.4
5/EEE/3
・・/・・/・・
100000/あああ/1.1

補足説明
・idは1から連番です。
・idが1もnum2以上ですが、その場合(その上にレコードが無いので)は取得しない想定です。
・全件取得後forでループさせれば取得できそうですが、実際は数万件以上データがありループだと処理に時間がかかりそうなので可能ならばSQLでデータを取得できればと思います。実現可能でしょうか?

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

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

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

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

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

YAmaGNZ

2022/12/02 07:18

idは1からの連番なのですか? また、id=1もnumが2以上ですがこの場合どうなるのですか?
musyoku

2022/12/02 07:22

>idは1からの連番なのですか? idは1から連番です。 >また、id=1もnumが2以上ですがこの場合どうなるのですか? その上のレコードが無いので取得しないです。 質問内容を質問文に記載いたします。
YAmaGNZ

2022/12/02 10:45

実行するのは「スプレッドシートのQuery関数を使って」なのですよね? そうなるとSQLServer等で使えるSQLとだいぶ差があると思うのですが一般的なSQLでいいんですかね?
KOZ6.0

2022/12/02 11:56

んー?と思ってググったら Cloud SQL というのがあって、SQLServer や MySQL, PostgreSQL が使えるようです。
musyoku

2022/12/03 07:19

具体的に通常のSQLとQuery関数でできる差は把握していないですが、Query関数が無料でSQLっぽく扱える関数なので利用したかったんです。Cloud SQLもありますが従量課金で使用する形のなのでQuery関数で代替できないかなと思い質問しました。
guest

回答2

0

ベストアンサー

ざっくり

SQL

1create table tbl (id int ,name varchar(10),num float); 2insert into tbl values 3(1,'AAA',2.1), 4(2,'BBB',1.8), 5(3,'CCC',1.5), 6(4,'DDD',2.4), 7(5,'EEE',3); 8 9 10select t1.* from tbl as t1 11inner join tbl as t2 12on t2.num>=2 and t1.id=t2.id-1

投稿2022/12/02 09:32

yambejp

総合スコア114769

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

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

yambejp

2022/12/02 09:39

連番が担保されている前提
musyoku

2022/12/03 07:21

SQLならこれで対象のデータを抽出できそうです!!INNER JOINでID-1の考えはありませんでした。これをQUERY関数で実現できるか実装してみます。ありがとうございました。
guest

0

SELECT A-1 WHERE C >= 2
みたいな感じで一旦numが2以上のidから1引いた値を列挙して
"SELECT * WHERE A MATCHES '^("& JOIN("|",E1:E11)&")$'"
と列挙したidを検索してはどうでしょう?

投稿2022/12/02 08:33

YAmaGNZ

総合スコア10242

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

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

musyoku

2022/12/03 07:25

QUERY関数での実装方法を書いて下さりありがとうございます。MATCHES以下の記載がまだ理解できていませんが、この書き方を踏まえて実装してみます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問