タグ付けされた質問 「aggregate」

複数のデータポイントを1つのデータポイントに組み合わせる。これは通常、SQLおよび通常はある種の集約関数を参照するために使用されます。

2
array_agg()が非集約ARRAY()コンストラクターより遅いのはなぜですか?
8.4より前のPostgreSQL向けに作成された古いコードをレビューしたところ、本当に気の利いたものが見つかりました。当時はカスタム関数でこれの一部を実行していたことを覚えていますが、事前にarray_agg()どのようなものかを忘れていました。レビューのために、現代の集計はこのように書かれています。 SELECT array_agg(x ORDER BY x DESC) FROM foobar; しかし、昔々、このように書かれていました、 SELECT ARRAY(SELECT x FROM foobar ORDER BY x DESC); それで、私はいくつかのテストデータでそれを試しました。 CREATE TEMP TABLE foobar AS SELECT * FROM generate_series(1,1e7) AS t(x); 結果は驚くべきものでした。.#OldSchoolCoolの方法は非常に高速で、25%高速化されました。さらに、ORDERを使用せずに単純化すると、同じ遅延が示されました。 # EXPLAIN ANALYZE SELECT ARRAY(SELECT x FROM foobar); QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------- Result (cost=104425.28..104425.29 rows=1 width=0) (actual time=1665.948..1665.949 rows=1 …

4
合計に対する行の割合の計算
悪いタイトルをおologiesび申し上げますが、これに適したタイトルになるかどうかはわかりませんでした。 これは現在(の簡略化されたビュー)私が作業しているデータです Agent | Commission ---------|------------ Smith | 100 Neo | 200 Morpheus | 300 各エージェントが担当するコミッション合計の割合を計算する必要があります。 したがって、エージェントスミスの場合、パーセンテージは次のように計算されます。 (Agent Smith's commission / Sum(commission)*100 だから、私の予想されるデータは Agent | Commission | % Commission ---------|---------------|--------------- Smith | 100 | 17 Neo | 200 | 33 Morpheus | 300 | 50 各エージェントのコミッションを返す機能があります。パーセンテージを返す別の関数があります(Commission/Sum(Commission))*100。問題は、Sum(commission)各行ごとに計算され、このクエリがデータウェアハウスで実行されることを考えると、データセットがかなり大きくなり(現在、2000レコードをわずかに下回っている)、正直なところ、悪いアプローチ(IMO )。 Sum(Commission)フェッチされるすべての行に対して計算しないようにする方法はありますか? 私は2つの部分のクエリの行で何かを考えていました。最初の部分はsum(commission)パッケージ変数/タイプにフェッチし、2番目の部分はこの事前に計算された値を参照しますが、これをどのように達成できるかわかりません。 SQLの使用に制限されており、Oracle …

1
なぜこのストリーム集約が必要なのですか?
このクエリをご覧ください。それは非常に簡単です(テーブルとインデックスの定義、および再現スクリプトについては投稿の最後をご覧ください): SELECT MAX(Revision) FROM dbo.TheOneders WHERE Id = 1 AND 1 = (SELECT 1); 注:「AND 1 =(SELECT 1)は、このクエリが自動パラメータ化されないようにするためのものです。これは問題を混乱させているように感じました。 そして、これがプランです(プランのリンクを貼り付けてください): そこには「トップ1」があるので、ストリーム集約演算子を見て驚いた。1行のみであることが保証されているので、私には必要ないようです。 その理論をテストするために、この論理的に同等のクエリを試しました。 SELECT MAX(Revision) FROM dbo.TheOneders WHERE Id = 1 GROUP BY Id; これがその計画です(計画のリンクを貼り付けてください): 案の定、group by planは、ストリーム集約演算子なしで対応できます。 両方のクエリがインデックスの最後から「後方」を読み取り、「トップ1」を実行して最大リビジョンを取得することに注意してください。 ここで何が欠けていますか? ストリーム集合体は最初のクエリで実際に動作するのですか、それとも排除する必要がありますか(それはオプティマイザーの制限であり、そうではありません)? ちなみに、これは信じられないほど実用的な問題ではないことを認識しています(クエリは両方ともCPUの0ミリ秒と経過時間を報告します)。 上記の2つのクエリを実行する前に実行したセットアップコードを次に示します。 DROP TABLE IF EXISTS dbo.TheOneders; GO CREATE TABLE dbo.TheOneders …

3
GROUP BY句を使用した場合よりも、GROUP BY句を使用した場合の方が、集計クエリが大幅に高速になるのはなぜですか?
GROUP BY句を使用しない場合よりも、句を使用した場合に集計クエリの方がはるかに高速に実行される理由を知りたいのです。 たとえば、このクエリの実行には約10秒かかります SELECT MIN(CreatedDate) FROM MyTable WHERE SomeIndexedValue = 1 これは1秒もかかりませんが SELECT MIN(CreatedDate) FROM MyTable WHERE SomeIndexedValue = 1 GROUP BY CreatedDate CreatedDateこの場合は1つしかないため、グループ化されたクエリは、グループ化されていないクエリと同じ結果を返します。 2つのクエリの実行プランが異なることに気付きました-2番目のクエリは並列処理を使用しますが、最初のクエリは使用しません。 GROUP BY句がない場合、SQLサーバーが集計クエリを異なる方法で評価するのは正常ですか?また、GROUP BY句を使用せずに最初のクエリのパフォーマンスを改善するためにできることはありますか? 編集 OPTION(querytraceon 8649)並列処理のコストオーバーヘッドを0に設定するために使用できることを学びました。これにより、クエリで並列処理が使用され、ランタイムが2秒に短縮されます。 SELECT MIN(CreatedDate) FROM MyTable WHERE SomeIndexedValue = 1 OPTION(querytraceon 8649) クエリはユーザーの選択時に値を入力することを目的としているため、実行時間を短くしたいので、グループ化されたクエリのように瞬時に実行するのが理想的です。今はクエリをラップしていますが、それが理想的なソリューションではないことはわかっています。 SELECT Min(CreatedDate) FROM ( SELECT Min(CreatedDate) as CreatedDate …

1
Transact-SQLの集計関数の後に等号(=)を配置できますか?
私はこのようなスクリプトに遭遇しました: set @sum = sum = (case when somecol1 is null then DATEDIFF(d,[somecol2],somecol3) else 0 end) 2番目のキーワードの合計の後の等号(=)の意味が理解できません。クエリを実行すると、等号がある場合とない場合の両方でエラーが表示されません。 キーワードの後に​​等号を付ける目的を知りたいsum。それは間違いですか? ありがとう

1
Postgresでウィンドウ関数の集計を取得するにはどうすればよいですか?
次のように、整数配列の置換/組み合わせの2つの列を含むテーブルと、値を含む3番目の列があります。 CREATE TABLE foo ( perm integer[] NOT NULL, combo integer[] NOT NULL, value numeric NOT NULL DEFAULT 0 ); INSERT INTO foo VALUES ( '{3,1,2}', '{1,2,3}', '1.1400' ), ( '{3,1,2}', '{1,2,3}', '0' ), ( '{3,1,2}', '{1,2,3}', '1.2680' ), ( '{3,1,2}', '{1,2,3}', '0' ), ( '{3,1,2}', '{1,2,3}', '1.2680' ), ( …

4
列を合計して個別のバケットを作成するウィンドウクエリを作成するにはどうすればよいですか?
次のような10進値の列を含むテーブルがあります。 id value size -- ----- ---- 1 100 .02 2 99 .38 3 98 .13 4 97 .35 5 96 .15 6 95 .57 7 94 .25 8 93 .15 私が成し遂げる必要があることは、説明するのが少し難しいので、ご容赦ください。私がやろうとしているのは、size列の集計値を作成することvalueです。これは、に従って降順で、前の行の合計が1になるたびに1ずつ増加します。結果は次のようになります。 id value size bucket -- ----- ---- ------ 1 100 .02 1 2 99 .38 1 3 98 …


2
結合されたテーブルの集計値の増分カウントを取得する
私は、MySQL 5.7.22、データベース内の2つのテーブルを持っている:postsとreasons。各投稿行には、多くの理由行があり、それに属しています。それぞれの理由には重みが関連付けられているため、各投稿には合計重みが関連付けられています。 重みの10ポイント(つまり、0、10、20、30など)の増分ごとに、その増分以下の合計重みを持つ投稿の数を取得します。その結果は次のようになるはずです。 weight | post_count --------+------------ 0 | 0 10 | 5 20 | 12 30 | 18 ... | ... 280 | 20918 290 | 21102 ... | ... 1250 | 118005 1260 | 118039 1270 | 118040 総重量はほぼ正規分布しており、非常に低い値と非常に高い値がいくつかありますが(最大値は現在1277)、大部分は中央にあります。の行数は120,000弱posts、約は120ですreasons。各投稿には、平均して5つまたは6つの理由があります。 テーブルの関連部分は次のようになります。 CREATE TABLE `posts` ( id BIGINT PRIMARY KEY …

2
配列の効率的なマージ(重複の削除)
テーブルが2つleft2ありright2ます。両方のテーブルは大きくなります(1〜1000万行)。 CREATE TABLE left2(id INTEGER, t1 INTEGER, d INTEGER); ALTER TABLE left2 ADD PRIMARY KEY (id,t1); CREATE TABLE right2( t1 INTEGER, d INTEGER, arr INTEGER[] ); ALTER TABLE right2 ADD PRIMARY KEY(t1,d); このタイプのクエリを実行します。 SELECT l.d + r.d, UNIQ(SORT((array_agg_mult(r.arr))) FROM left2 l, right2 r WHERE l.t1 = r.t1 GROUP BY l.d …

1
複数の結合を持つ個別の行の合計
スキーマ: CREATE TABLE "items" ( "id" SERIAL NOT NULL PRIMARY KEY, "country" VARCHAR(2) NOT NULL, "created" TIMESTAMP WITH TIME ZONE NOT NULL, "price" NUMERIC(11, 2) NOT NULL ); CREATE TABLE "payments" ( "id" SERIAL NOT NULL PRIMARY KEY, "created" TIMESTAMP WITH TIME ZONE NOT NULL, "amount" NUMERIC(11, 2) NOT NULL, …

2
1つのSELECTステートメントで複数の範囲のカウントを返す
fooとりわけ、score0から10の範囲の列を持つPostgresデータベーステーブルがあります。クエリで、スコアの合計数、0から3までのスコアの数、4の間のスコアの数を返します。 6、7から10までのスコアの数。次のようなもの: SELECT COUNT(*) as total, COUNT( SELECT * from foo where score between 0 and 3; ) as low, COUNT( SELECT * from foo where score between 4 and 6; ) as mid, COUNT( SELECT * from foo where score between 7 and 10; ) as high FROM foo; …

2
配列integer []:テーブル内のすべての個別の値を取得してカウントする方法は?
SQL(PostgreSQL)はあまり得意ではありません。これが私がやりたいことです: テーブルとフィールドがあります: id SERIAL inet INET ports integer[] id | inet | ports ----+------------+------------ 2 | 1.2.2.1 | {80} 1 | 1.2.3.4 | {80,12} ... どうやって このテーブルで使用されているすべての「ポート」値を取得します:80、12 特定のポートにあるinetアドレスの数を数えます: このような: port | count --------+------------ 12 | 1 80 | 2 ... 誰かがDjangoバージョンを探している場合: class Unnest(Func): function = 'UNNEST' Model.objects \ .annotate(port=Unnest('ports', distinct=True)) …

1
postgresqlでのSQL時間ごとのデータ集約
私はデータベースの初心者なので、このデータベースについてあなたの助けを求めています。 時系列データを含むテーブルがあります。 2012/01/01 00:10, 10 2012/01/01 00:30, 5 2012/01/01 01:00, 10 2012/01/01 01:40, 10 2012/01/01 02:00, 20 テーブルは、間隔の上限のみを維持することにより、間隔ベースのデータを格納しています。たとえば、最初の行は[00:00-00:10]からの間隔を10の値で表し、2番目の行は(00:10-00:30]からの間隔を5の値で表し、3番目の行は間隔は(00:30-01:00)で、値は10です。 上記のような構造の時間別データを集約するために、Postgresで効率的なクエリが必要です。したがって、結果は次のようになります。 2012/01/01 00:00, 2012/01/01 01:00, 25 2012/01/01 01:00, 2012/01/01 02:00, 30 時系列データは大きいので、これをインデックス付けする際の助けがあれば非常にありがたいです。 ありがとう、ダン

3
SUM()を2回使用するのは最適ではありませんか?
句で使用する場合(または派生テーブルを使用する場合)SUM、2回記述する必要があることはわかっていHAVINGます。 SELECT id, sum(hours) AS totalhours FROM mytable GROUP BY id HAVING sum(hours) > 50; 私の質問は、これが最適ではないかどうかです。プログラマーとして、このクエリは、DBが合計を2回計算するように見えます。そうですか、それともDBエンジンが行う最適化に依存すべきですか? 更新:比較可能なクエリの説明: postgres=> explain select sum(counttodo) from orderline group by orderlineid having sum(counttodo) > 100; QUERY PLAN -------------------------------------------------------------------- HashAggregate (cost=1.31..1.54 rows=18 width=8) Filter: (sum(counttodo) > 100) -> Seq Scan on orderline (cost=0.00..1.18 rows=18 width=8) (3 …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.