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

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

5
集計値の保存と計算
集計値を保存するタイミングと、その場でそれらを計算するタイミングを決定するためのガイドラインまたは経験則はありますか? たとえば、ユーザーが評価できるウィジェットがあるとします(下のスキーマを参照)。ウィジェットを表示するたびに、Ratingsテーブルから平均ユーザー評価を計算できました。または、Widgetテーブルに平均評価を保存できます。これにより、ウィジェットを表示するたびに評価を計算する必要がなくなりますが、ユーザーがウィジェットを評価するたびに平均評価を再計算する必要があります。 Ratings Widgets --------- ------- widget_id widget_id user_id name rating avg_rating <--- The column in question


7
簡単な銀行スキーマの作成:残高を取引履歴と同期させるにはどうすればよいですか?
単純な銀行データベースのスキーマを書いています。基本的な仕様は次のとおりです。 データベースは、ユーザーと通貨に対するトランザクションを保存します。 すべてのユーザーは通貨ごとに1つの残高を持っているため、各残高は特定のユーザーと通貨に対するすべてのトランザクションの合計です。 残高をマイナスにすることはできません。 銀行のアプリケーションは、ストアドプロシージャを介してデータベースとのみ通信します。 このデータベースは、1日に数十万件の新しいトランザクションを受け入れ、さらに高いレベルでクエリのバランスを取ることを期待しています。残高を非常に迅速に提供するには、事前に集計する必要があります。同時に、残高が取引履歴と矛盾しないことを保証する必要があります。 私のオプションは次のとおりです。 別のbalancesテーブルを用意して、次のいずれかを実行します。 トランザクションをテーブルtransactionsとbalancesテーブルの両方に適用します。TRANSACTIONストアドプロシージャレイヤーのロジックを使用して、残高とトランザクションが常に同期されるようにします。(Jackによるサポート。) transactionsテーブルにトランザクションを適用balancesし、トランザクション量でテーブルを更新するトリガーを使用します。 balancesテーブルにトランザクションを適用transactionsし、トランザクション量とともにテーブルに新しいエントリを追加するトリガーを使用します。 ストアドプロシージャの外部で変更が行われないようにするには、セキュリティベースのアプローチに頼る必要があります。そうしないと、たとえば、一部のプロセスがtransactionsテーブルにトランザクションを直接挿入し、スキーム1.3の下で関連するバランスが同期しなくなる可能性があります。 balancesトランザクションを適切に集約するインデックス付きビューを用意します。残高はトランザクションと同期するようにストレージエンジンによって保証されているため、これを保証するためにセキュリティベースのアプローチに依存する必要はありません。一方、ビュー(インデックス付きビューでも)にCHECK制約を設定することはできないため、バランスを負以外に強制することはできません。(Dennyによるサポート。) transactionsテーブルだけがありますが、そのトランザクションの実行直後に有効な残高を保存するための追加の列があります。したがって、ユーザーと通貨の最新のトランザクションレコードには、現在の残高も含まれます。(Andrewが以下に提案。garikが提案したバリアント。) この問題に最初に取り組んだとき、私はこれら 2つの議論を読み、オプションを決定しました2。参考のために、ここでそれのベアボーン実装を見ることができます。 このようなデータベースを高負荷プロファイルで設計または管理しましたか?この問題の解決策は何ですか? 私が正しいデザインを選んだと思いますか?留意すべきことはありますか? たとえば、transactionsテーブルのスキーマを変更するには、balancesビューを再構築する必要があることを知っています。データベースを小さく保つためにトランザクションをアーカイブしている場合でも(たとえば、他の場所に移動してサマリートランザクションに置き換えることで)、スキーマの更新ごとに数千万のトランザクションからビューを再構築する必要がある場合、展開ごとのダウンタイムが大幅に長くなる可能性があります。 インデックス付きビューを使用する方法がある場合、マイナスの残高がないことをどのように保証できますか? トランザクションのアーカイブ: アーカイブトランザクションと上記の「サマリートランザクション」について少し詳しく説明します。まず、このような高負荷システムでは定期的なアーカイブが必要になります。古い取引を別の場所に移動できるようにしながら、残高と取引履歴の間の一貫性を維持したいと思います。これを行うには、アーカイブされたトランザクションのすべてのバッチを、ユーザーと通貨ごとの金額のサマリーに置き換えます。 したがって、たとえば、このトランザクションのリスト: user_id currency_id amount is_summary ------------------------------------------------ 3 1 10.60 0 3 1 -55.00 0 3 1 -12.12 0 アーカイブされ、これに置き換えられます: user_id currency_id amount is_summary ------------------------------------------------ 3 1 -56.52 1 …

14
ListAggの重複を排除する(Oracle)
Oracle 11.2より前は、カスタム集計関数を使用して列を行に連結していました。11.2 LISTAGG関数を追加したので、代わりにそれを使用しようとしています。私の問題は、結果の重複を排除する必要があり、それができないようだということです。 以下に例を示します。 CREATE TABLE ListAggTest AS ( SELECT rownum Num1, DECODE(rownum,1,'2',to_char(rownum)) Num2 FROM dual CONNECT BY rownum<=6 ); SELECT * FROM ListAggTest; NUM1 NUM2 ---------- --------------------- 1 2 2 2 << Duplicate 2 3 3 4 4 5 5 6 6 私が見たいのはこれです: NUM1 NUM2S ---------- -------------------- 1 2-3-4-5-6 …

5
PostgreSQLの選択クエリでデフォルト値を使用するにはどうすればよいですか?
行が返されない場合に使用する列のデフォルト値を使用したいと思います。PostgreSQLで可能ですか?どうすればいいですか?または、これを解決できる他の方法はありますか? たとえば、次のようなものです。 SELECT MAX(post_id) AS max_id DEFAULT 0 FROM my_table WHERE org_id = 3 そしてorg_id = 3、テーブルに行がない場合、私は返したいです0。

7
SQL Server 2005で最小の複数列を取得する最も効率的な方法は何ですか?
6列の最小値を取得したい状況です。 これを達成するためにこれまでに3つの方法を見つけましたが、これらの方法のパフォーマンスに懸念があり、どちらがパフォーマンスに優れているかを知りたいと思います。 最初の方法は、大きなcaseステートメントを使用することです。上記のリンクの例に基づいて、3列の例を次に示します。6つの列を見るので、私のcaseステートメントはもっと長くなります。 Select Id, Case When Col1 <= Col2 And Col1 <= Col3 Then Col1 When Col2 <= Col3 Then Col2 Else Col3 End As TheMin From MyTable 2番目のオプションはUNION、複数の選択ステートメントで演算子を使用することです。Idパラメーターを受け入れるUDFにこれを配置します。 select Id, dbo.GetMinimumFromMyTable(Id) from MyTable そして select min(col) from ( select col1 [col] from MyTable where Id = @id union …

3
ANSI SQLがSUM(行なし)をNULLとして定義するのはなぜですか?
ANSI SQL標準定義(章6.5、セット機能仕様)空の結果セット上の集約関数の次の動作: COUNT(...) = 0 AVG(...) = NULL MIN(...) = NULL MAX(...) = NULL SUM(...) = NULL 空のセットの平均、最小、最大は定義されていないため、AVG、MIN、MAXにNULLを返すことは完全に理にかなっています。 ただし、最後の1つは気になります。数学的には、空のセットのSUMは明確に定義されています0。基本ケースがすべての一貫性を保つため、加算の中立要素である0を使用します。 SUM({}) = 0 = 0 SUM({5}) = 5 = 0 + 5 SUM({5, 3}) = 8 = 0 + 5 + 3 SUM({5, NULL}) = NULL = 0 + 5 + …

4
SQLクエリでのGROUP BYなしのHAVINGの使用
HAVINGSQLクエリで使用するにはGROUP BY、列名を集約する必要がありますか? SQLクエリHAVINGなしで使用できる特殊なケースはありGROUP BYますか? 同時に共存する必要がありますか?
26 aggregate 

3
Access(Jet)SQL:TableAの各DateTimeスタンプに隣接するTableBのDateTimeスタンプ
最初の言葉 あなたは安全に(を含む)以下のセクションを無視することができます結合します皮切りあなただけのコードの亀裂を取りたい場合。背景と結果がちょうど文脈としての役割を果たす。最初にコードがどのように表示されたかを確認するには、2015年10月6日より前の編集履歴をご覧ください。 目的 最終的には、表の観測値に直接隣接する表の利用可能なGPSデータのDateTimeスタンプに基づいて、送信機(XまたはXmit)の補間GPS座標を計算SecondTableしますFirstTable。 究極の目標を達成するための私の当面の目標は、これらの側面の時点を得るためにどのように参加FirstTableするのSecondTableが最善かを見つけることです。後で、その情報を使用して、正距円筒座標系に沿った線形近似を仮定して中間GPS座標を計算できます(このスケールでは、地球が球体であることを気にしないと言った派手な言葉)。 ご質問 最も近い前後のタイムスタンプを生成するより効率的な方法はありますか? 「after」を取得し、「after」に関連する場合にのみ「before」を取得することで、自分で修正しました。 (A<>B OR A=B)構造を含まない、より直感的な方法はありますか。 Byrdzeyeは基本的な選択肢を提供しましたが、私の「実世界」の経験は、同じことを実行する彼の4つの結合戦略すべてとは一致しませんでした。しかし、代替結合スタイルに対処したことに対する彼の完全な信用。 あなたが持つかもしれない他の考え、トリックやアドバイス。 両方Thusfar byrdzeyeとPhrancisはこの点で非常に役立っています。私は、ことがわかっPhrancis'アドバイスが、私はここに彼に端をあげるので良好、レイアウトおよび重要な段階での支援を提供しました。 質問3に関して私が受けることができる追加の助けをまだ感謝しています。 箇条書きは、個々の質問で私を最も助けたと思う人を反映しています。 テーブル定義 半視覚的表現 FirstTable Fields RecTStamp | DateTime --can contain milliseconds via VBA code (see Ref 1) ReceivID | LONG XmitID | TEXT(25) Keys and Indices PK_DT | Primary, Unique, No Null, Compound XmitID …

3
PostgreSQLには、タイプセーフなfirst()集約関数がありますか?
完全な質問の書き直し First()集計関数を探しています。 ここで、ほとんど機能するものを見つけました。 CREATE OR REPLACE FUNCTION public.first_agg ( anyelement, anyelement ) RETURNS anyelement LANGUAGE sql IMMUTABLE STRICT AS $$ SELECT $1; $$; -- And then wrap an aggregate around it CREATE AGGREGATE public.first ( sfunc = public.first_agg, basetype = anyelement, stype = anyelement ); 問題は、varchar(n)列がfirst()関数を通過するときに、単純なvarchar(サイズなし)に変換されることです。関数でクエリをRETURNS SETOF anyelementとして返そうとすると、次のエラーが表示されます。 エラー:クエリの構造がSQL:42804関数結果の型と一致しません。 )RETURN …

1
ローリングサム/カウント/日付間隔の平均
18か月にわたる1,000のエンティティにまたがるトランザクションのデータベースで、クエリを実行して、可能な30日間ごとにentity_idトランザクション量のSUMとその30日間のトランザクションのCOUNTでグループ化します。クエリを実行できる方法でデータを返します。多くのテストの後、このコードは私が望むものの多くを達成します: SELECT id, trans_ref_no, amount, trans_date, entity_id, SUM(amount) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_total, COUNT(id) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_count FROM transactiondb; そして、次のような構造の大きなクエリで使用します。 SELECT * FROM ( …

4
個別の範囲を可能な限り最大の連続する範囲に結合する
複数の日付範囲(最大負荷は約500、ほとんどの場合は10)を、最大の連続する日付範囲に重複する場合も重複しない場合もあります。例えば: データ: CREATE TABLE test ( id SERIAL PRIMARY KEY NOT NULL, range DATERANGE ); INSERT INTO test (range) VALUES (DATERANGE('2015-01-01', '2015-01-05')), (DATERANGE('2015-01-01', '2015-01-03')), (DATERANGE('2015-01-03', '2015-01-06')), (DATERANGE('2015-01-07', '2015-01-09')), (DATERANGE('2015-01-08', '2015-01-09')), (DATERANGE('2015-01-12', NULL)), (DATERANGE('2015-01-10', '2015-01-12')), (DATERANGE('2015-01-10', '2015-01-12')); テーブルは次のようになります。 id | range ----+------------------------- 1 | [2015-01-01,2015-01-05) 2 | [2015-01-01,2015-01-03) 3 | [2015-01-03,2015-01-06) …

3
このクエリの正しい結果は何ですか?
ここのコメントでこのパズルに出会いました CREATE TABLE r (b INT); SELECT 1 FROM r HAVING 1=1; SQL ServerとPostgreSQLは 1行を返します。 MySQLおよびOracleはゼロ行を返します。 どちらが正しい?または、両方とも同等に有効ですか?


1
サブクエリを使用する場合のPostgresエラー[GROUP BY句に表示するか、集計関数で使用する必要があります]
2つのテーブルemployeeとがありphonesます。従業員は0〜n個の電話番号を持つことができます。従業員の名前と電話番号をリストしたいと思います。私はうまく動作する以下のクエリを使用しています。 SELECT empname,array_agg(phonenumber) AS phonenumbers FROM employee LEFT OUTER JOIN phones ON employee.empid = phones.empid GROUP BY employee.empid 従業員表には多数の行が含まれる場合があります。一度に数人の従業員のみを取得します。たとえば、電話番号で3人の従業員を取得します。このクエリを実行しようとしています。 SELECT empname,array_agg(phonenumber) AS phonenumbers FROM (SELECT * FROM employee ORDER BY empname LIMIT 3 OFFSET 0) AS employee LEFT OUTER JOIN phones ON employee.empid = phones.empid GROUP BY employee.empid しかし、私はこのエラーを受け取ります。ERROR: column …

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