C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: SQL文で最大値で更新する


(過去ログ 176 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■101005 / inTopicNo.1)  SQL文で最大値で更新する
  
□投稿者/ tukey (1回)-(2022/12/09(Fri) 10:39:05)

分類:[データベース全般] 

以下のようなデータがあります。
nameごとに最大値で更新したいのですが、方法ありますでしょうか?(mwgtが入手したい列です)

id name nid weight mwgt
1 坂本 1 68 68
2 坂本 2 75 75
3 坂本 3 69 75
4 坂本 4 65 75
5 山岡 1 67 67
6 赤橋 1 42 42
7 赤橋 2 59 59
8 赤橋 3 40 59
9 西 1 69 69
10 西 2 65 69
11 西 3 68 69
12 西 4 70 70
13 西 5 66 70

こんな感じで書くと、nameごとの最大値になってしまいます。
最大値で更新するような列を取得したいのです。

SELECT id,name,nid,weight,
MAX(weight) OVER (PARTITION BY name ) AS mwgt
FROM "dev"."tmp"."member2"
--GROUP BY id,name,nid
ORDER BY id,nid

よろしくお願いします

引用返信 編集キー/
■101006 / inTopicNo.2)  Re[1]: SQL文で最大値で更新する
□投稿者/ KOZ (369回)-(2022/12/09(Fri) 11:31:08)
No101005 (tukey さん) に返信

# 回答ではありません。

・対象とする DB は何ですか?

・以下が矛盾するように思います。どういう意味でしょうか?

> nameごとに最大値で更新したいのですが、方法ありますでしょうか?(mwgtが入手したい列です)

> こんな感じで書くと、nameごとの最大値になってしまいます。
> 最大値で更新するような列を取得したいのです。

引用返信 編集キー/
■101007 / inTopicNo.3)  Re[2]: SQL文で最大値で更新する
□投稿者/ furu (190回)-(2022/12/09(Fri) 11:44:56)
No101005 (tukey さん) に返信
何から何まで理解できません。

・「最大値で更新したいのですが」
 「列を取得したい」
 求めるSQLは更新(update)ですか? 取得(select)ですか?

・「nameごとに最大値で更新したい」
 「nameごとの最大値になってしまいます」
 nameごとの最大値になっているなら
 nameごとに最大値で更新できないですか?

・「以下のようなデータがあります」
 「mwgtが入手したい列です」
 既に入手したい列があるなら、何もやることない?

元データと結果データを記載してもらえませんか?

何のDBか書いてもらえると
SQLの方言が使えるので回答しやすいです。
引用返信 編集キー/
■101008 / inTopicNo.4)  Re[3]: SQL文で最大値で更新する
□投稿者/ tukey (2回)-(2022/12/09(Fri) 13:15:28)
KOZさん、furuさん
返信ありがとうございます。

すいません、書き直します
やろうとしてるのは、AWS Redshiftです。
以下のようなデータがあります。
同じ名前の人の最大値で書き換えたいのですが、それを行ごとに実施したいのです。

id name nid weight
1 坂本 1 68
2 坂本 2 75
3 坂本 3 69
4 坂本 4 65
5 山岡 1 67
6 赤橋 1 42
7 赤橋 2 59
8 赤橋 3 40
9 西 1 69
10 西 2 65
11 西 3 68
12 西 4 70
13 西 5 66
このデータから、以下のような新しい列mwgtを作りたい。

id=1のweightが68なので、mwgtが68
id=2のweightが75なので、mwgtが75
id=3のweightが69なので、mwgtが75
id=4のweightが65なので、mwgtが75
という具合に行をみて、値が大きかったらその値で更新する感じで、新しい列を作りたい次第です。
最大値になってしまうというのは、すべてのmwgtが75になってしまうという意味です。

こちらでわかりますでしょうか?

お手数おかけいたします。



No101007 (furu さん) に返信
> ■No101005 (tukey さん) に返信
> 何から何まで理解できません。
>
> ・「最大値で更新したいのですが」
>  「列を取得したい」
>  求めるSQLは更新(update)ですか? 取得(select)ですか?
>
> ・「nameごとに最大値で更新したい」
>  「nameごとの最大値になってしまいます」
>  nameごとの最大値になっているなら
>  nameごとに最大値で更新できないですか?
>
> ・「以下のようなデータがあります」
>  「mwgtが入手したい列です」
>  既に入手したい列があるなら、何もやることない?
>
> 元データと結果データを記載してもらえませんか?
>
> 何のDBか書いてもらえると
> SQLの方言が使えるので回答しやすいです。
引用返信 編集キー/
■101009 / inTopicNo.5)  Re[4]: SQL文で最大値で更新する
□投稿者/ KOZ (370回)-(2022/12/09(Fri) 14:18:52)
No101008 (tukey さん) に返信
> id=1のweightが68なので、mwgtが68
> id=2のweightが75なので、mwgtが75
> id=3のweightが69なので、mwgtが75
> id=4のweightが65なので、mwgtが75
> という具合に行をみて、値が大きかったらその値で更新する感じで、新しい列を作りたい次第です。

その行と name が同じ AND id がその行の id 以下、の条件で MAX(weight) というわけですね。

AWS Redshift は PostgreSQL のようなので自分は回答できません。
引用返信 編集キー/
■101010 / inTopicNo.6)  Re[4]: SQL文で最大値で更新する
□投稿者/ 大谷刑部 (224回)-(2022/12/09(Fri) 14:34:57)
No101008 (tukey さん) に返信
> このデータから、以下のような新しい列mwgtを作りたい。
>
> id=1のweightが68なので、mwgtが68
> id=2のweightが75なので、mwgtが75
> id=3のweightが69なので、mwgtが75
> id=4のweightが65なので、mwgtが75
> という具合に行をみて、値が大きかったらその値で更新する感じで、新しい列を作りたい次第です。
> 最大値になってしまうというのは、すべてのmwgtが75になってしまうという意味です。

ということならselect update の結合条件がおかしいだけな気もしますがそれなら実際に実行してるupdate文を記載してどこが悪いんでしょう?
と質問していただいた方がいいんではないかと。

AWS Redshiftでもcaseが使えるようなのでそっちで実現してもいいのかもしれないですね。

引用返信 編集キー/
■101011 / inTopicNo.7)  Re[5]: SQL文で最大値で更新する
□投稿者/ tukey (3回)-(2022/12/09(Fri) 17:36:32)
大谷刑部 さん

返信ありがとうございました。

CASEとか、LAGを使っていろいろやってみたのですが、どうもうまくいきませんでした。

updateは使ってなかったです。
idが小さく、かつ値が大きかったら更新という感じで記載するんですね。
ちょっとやってみます。
ありがとうございます




No101010 (大谷刑部 さん) に返信
> ■No101008 (tukey さん) に返信
>>このデータから、以下のような新しい列mwgtを作りたい。
>>
>>id=1のweightが68なので、mwgtが68
>>id=2のweightが75なので、mwgtが75
>>id=3のweightが69なので、mwgtが75
>>id=4のweightが65なので、mwgtが75
>>という具合に行をみて、値が大きかったらその値で更新する感じで、新しい列を作りたい次第です。
>>最大値になってしまうというのは、すべてのmwgtが75になってしまうという意味です。
>
> ということならselect update の結合条件がおかしいだけな気もしますがそれなら実際に実行してるupdate文を記載してどこが悪いんでしょう?
> と質問していただいた方がいいんではないかと。
>
> AWS Redshiftでもcaseが使えるようなのでそっちで実現してもいいのかもしれないですね。
>
引用返信 編集キー/
■101012 / inTopicNo.8)  Re[6]: SQL文で最大値で更新する
□投稿者/ 伝説のカレー (55回)-(2022/12/09(Fri) 18:44:35)
SELECT
  id
  , name
  , nid
  , weight
  , (
    SELECT
      max(weight)
    FROM
      "dev"."tmp"."member2" i
    WHERE
      i.name = o.name
      AND i.id <= o.id
  ) mwgt
FROM
  "dev"."tmp"."member2" o

こうかな、Redshiftを使うということはそれなりに大量のデータがあるんじゃないかなと思ってて
Redshiftは更新の処理が遅かったような覚えがあります
別テーブルを作ってSELECT INSERTした方が速いんじゃないかなと思います
そのあたりは要検証って感じですねー

引用返信 編集キー/
■101013 / inTopicNo.9)  Re[7]: SQL文で最大値で更新する
□投稿者/ 伝説のカレー (56回)-(2022/12/10(Sat) 01:36:13)
max(weight) over(partition by name order by id) mwgt

order byをつけるだけでよかったかも
引用返信 編集キー/
■101014 / inTopicNo.10)  Re[8]: SQL文で最大値で更新する
□投稿者/ furu (191回)-(2022/12/10(Sat) 11:32:53)
2022/12/10(Sat) 11:35:29 編集(投稿者)
No101013 (伝説のカレー さん) に返信
> max(weight) over(partition by name order by id) mwgt
> 
> order byをつけるだけでよかったかも
order by 付けるとそれまでの最大値になるんですね。

ということで

--idをprimary key, name毎にnid順に最大値
with AAAAA
as
(
    select id, max(weight) over(partition by name order by nid) mwgt
    from "dev"."tmp"."member2"
)
update "dev"."tmp"."member2"
set mwgt = AAAAA.mwgt
from AAAAA
where "dev"."tmp"."member2".id = AAAAA.id;

引用返信 編集キー/
■101028 / inTopicNo.11)  Re[9]: SQL文で最大値で更新する
□投稿者/ tukey (4回)-(2022/12/12(Mon) 09:52:06)
伝説のカレー さん
furu さん

回答いただきありがとうございました。大変助かりました。
伝説のカレーさんのヒントから、こんな風にしても動きました。
フレームで、パーティションの最初から現在の行とした

SELECT id,name,nid,weight,
MAX(weight) OVER (PARTITION BY name ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS mwgt
FROM "dev"."tmp"."member2"
ORDER BY id,nid
;

ご回答並びにヒントを頂きありがとうございました。
大感謝です。



No101014 (furu さん) に返信
> 2022/12/10(Sat) 11:35:29 編集(投稿者)
>
> ■No101013 (伝説のカレー さん) に返信
>>max(weight) over(partition by name order by id) mwgt
>>
>>order byをつけるだけでよかったかも
> order by 付けるとそれまでの最大値になるんですね。
>
> ということで
>
> --idをprimary key, name毎にnid順に最大値
> with AAAAA
> as
> (
> select id, max(weight) over(partition by name order by nid) mwgt
> from "dev"."tmp"."member2"
> )
> update "dev"."tmp"."member2"
> set mwgt = AAAAA.mwgt
> from AAAAA
> where "dev"."tmp"."member2".id = AAAAA.id;
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -