タグ付けされた質問 「group-by」

GROUP BY:一般的な値のSQL集計

2
GROUP BYステートメントのワイルドカードが機能しないのはなぜですか?
次のSQLステートメントを機能させようとしていますが、構文エラーが発生します。 SELECT A.*, COUNT(B.foo) FROM TABLE1 A LEFT JOIN TABLE2 B ON A.PKey = B.FKey GROUP BY A.* ここで、Aは40列の幅の広いテーブルであり、可能であればGROUP BY句に各列名をリストしないようにします。同様のクエリを実行する必要のあるこのようなテーブルが多数あるため、ストアドプロシージャを作成する必要があります。これにアプローチする最良の方法は何ですか? MS SQL Server 2008を使用しています。


2
大きなPostgresSQLテーブルでCOUNT / GROUP-BYのパフォーマンスを改善しますか?
PostgresSQL 9.2を実行していますが、約6,700,000行の12列の関係があります。これには3D空間にノードが含まれ、各ノードはユーザー(作成者)を参照します。どのユーザーがいくつのノードを作成したかを照会するには、次のことを行います(詳細を追加explain analyze)。 EXPLAIN ANALYZE SELECT user_id, count(user_id) FROM treenode WHERE project_id=1 GROUP BY user_id; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------- HashAggregate (cost=253668.70..253669.07 rows=37 width=8) (actual time=1747.620..1747.623 rows=38 loops=1) -> Seq Scan on treenode (cost=0.00..220278.79 rows=6677983 width=8) (actual time=0.019..886.803 rows=6677983 loops=1) Filter: (project_id = 1) Total runtime: 1747.653 ms ご覧のとおり、これには約1.7秒かかります。これは、データの量を考えるとそれほど悪くはありませんが、これを改善できるかどうかは疑問です。ユーザー列にBTreeインデックスを追加しようとしましたが、これは何の助けにもなりませんでした。 代替案はありますか? 完全を期すために、これはすべてのインデックスを備えた完全なテーブル定義です(外部キーの制約、参照、トリガーはありません)。 Column …

6
json_agg内の列を選択します
次のようなクエリがあります: SELECT a.id, a.name, json_agg(b.*) as "item" FROM a JOIN b ON b.item_id = a.id GROUP BY a.id, a.name; JSONオブジェクトに含まれbないように列を選択するにはどうすればよいb.item_idですか? について読みましたがROW、次のようなJSONオブジェクトを返します。 {"f1": "Foo", "f2": "Bar"} 適切な列キーに一致するように取得したら、JSONオブジェクトを再マップする必要があります。それを避け、元の列名を保持したいと思います。

6
行の2つ以上の列が特定の値を超えている場所をカウントする[バスケットボール、ダブルダブル、トリプルダブル]
統計情報をデータベースファイルとして出力できるバスケットボールゲームをプレイしているので、ゲームに実装されていない統計情報を計算できます。これまでのところ、必要な統計を計算するのに何の問題もありませんでしたが、今では問題に直面しています:プレーヤーがシーズン中に作ったダブルダブルまたはトリプルダブルの数をゲーム統計からカウントすることです。 double doubleとtriple doubleの定義は次のとおりです。 ダブルダブル: ダブルダブルとは、プレイヤーがゲーム内で5つの統計カテゴリー(ポイント、リバウンド、アシスト、スチール、ブロックショット)のうち2つに合計2桁の数字を累積するパフォーマンスとして定義されます。 トリプルダブル: トリプルダブルとは、プレイヤーがゲーム内で5つの統計カテゴリー(ポイント、リバウンド、アシスト、スチール、ブロックショット)のうち3つに合計2桁の数字を累積するパフォーマンスとして定義されます。 Quadruple-double(明確にするために追加) 4倍ダブルは、プレーヤーがゲームで5つの統計カテゴリ(ポイント、リバウンド、アシスト、スチール、ブロックショット)の4つに合計2桁の数字を蓄積するパフォーマンスとして定義されます。 「PlayerGameStats」テーブルには、プレーヤーがプレイする各ゲームの統計が格納され、次のようになります。 CREATE TABLE PlayerGameStats AS SELECT * FROM ( VALUES ( 1, 1, 1, 'Nuggets', 'Cavaliers', 6, 8, 2, 2, 0 ), ( 2, 1, 2, 'Nuggets', 'Clippers', 15, 7, 0, 1, 3 ), ( 3, 1, 6, 'Nuggets', 'Trailblazers', …

6
表から「n」個の連続した無料番号を見つける
このような数字のテーブルがあります(ステータスはFREEまたはASSIGNEDです) id_set番号ステータス ----------------------- 1 000001割り当て済み 1 000002無料 1 000003割り当て済み 1 000004無料 1 000005無料 1 000006割り当て済み 10007割り当て済み 1 000008無料 1 000009無料 1 000010無料 1 000011割り当て済み 1 000012割り当て済み 1 000013割り当て済み 1 000014無料 1 000015割り当て済み 「n」個の連続した番号を見つける必要があるため、n = 3の場合、クエリは 1 000008無料 1 000009無料 1 000010無料 各id_setの最初の可能なグループのみを返す必要があります(実際、クエリごとにid_setに対してのみ実行されます) 私はWINDOW関数をチェックしてCOUNT(id_number) OVER (PARTITION BY id_set ROWS UNBOUNDED PRECEDING)いましたが、のようなクエリをいくつか試しましたが、それだけでした:) …

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 …

2
複数の列を選択し、1つだけグループ化する方法は?
に問題がgroup byあります。複数の列を選択しますが、1つの列のみでグループ化します。以下のクエリは私が試したものですが、エラーが発生しました。 SELECT Rls.RoleName,Pro.[FirstName],Pro.[LastName],Count(UR.[RoleId]) as [Count] from [b.website-sitecore-core].[dbo].[aspnet_UsersInRoles] UR inner join [b.website-professional-au].[dbo].[Profile] Pro on UR.UserId = Pro.Id inner join [b.website-sitecore-core].[dbo].[aspnet_Roles] Rls on Rls.RoleId = UR.RoleId inner join [b.website-professional-au].[dbo].[Gender] Gn on gn.Id = pro.GenderId GROUP BY Rls.RoleName;

4
GROUP BYおよびORDER BYを使用した大きなテーブルでのクエリが遅い
次のような、720万タプルのテーブルがあります。 table public.methods column | type | attributes --------+-----------------------+---------------------------------------------------- id | integer | not null DEFAULT nextval('methodkey'::regclass) hash | character varying(32) | not null string | character varying | not null method | character varying | not null file | character varying | not null type | character varying | …

7
グループ化またはウィンドウ
ウィンドウ関数を使用して解決できると思う状況がありますが、よくわかりません。 次の表を想像してください CREATE TABLE tmp ( date timestamp, id_type integer ) ; INSERT INTO tmp ( date, id_type ) VALUES ( '2017-01-10 07:19:21.0', 3 ), ( '2017-01-10 07:19:22.0', 3 ), ( '2017-01-10 07:19:23.1', 3 ), ( '2017-01-10 07:19:24.1', 3 ), ( '2017-01-10 07:19:25.0', 3 ), ( '2017-01-10 07:19:26.0', 5 ), …

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 …

4
カウントがゼロのグループを取得するにはどうすればよいですか?
SQLサーバーデータベースのデータからグラフを作成しようとします。カウントがゼロであっても、このストリートに住んでいるユーザーのカウントを含むすべてのストリートを取得します。 このために私はこのクエリを試しました: Create table Streets( ID int IDENTITY primary key, Name varchar(100) ); create table users( ID int IDENTITY primary key, Username varchar(100), StreetID int references Streets(id) ); insert into streets values ('1st street'), ('2nd street'), ('3rd street'), ('4th street'), ('5th street'); insert into users values ('Pol', 1), ('Doortje', 1), …

2
1つのテーブルに存在しない行を含む行を表示するSQL結合クエリ
私は従業員の時間記録についていくつかのレポートを作成しようとしています。 この質問に特化した2つの表があります。従業員はMembersテーブルに一覧表示され、毎日、彼らが実行した作業の時間エントリを入力し、Time_Entryテーブルに保存されます。 SQL Fiddleでの設定例:http ://sqlfiddle.com/#!3/ e3806/7 私は行くよ最終結果は番組表であるALLMembers列リストで、その後は他の列に照会した日のために彼らの合計時間が表示されます。 問題はTime_Entry、特定のメンバーのテーブルに行がない場合、そのメンバーの行があることです。私はいくつかの異なる結合タイプ(左、右、内部、外部、完全外部など)を試しましたが、(SQL Fiddleの最後の例に基づいて)希望どおりの結果が得られないようです。 /*** Desired End Result ***/ Member_ID | COUNTTime_Entry | TIMEENTRYDATE | SUMHOURS_ACTUAL | SUMHOURS_BILL ADavis | 0 | 11-10-2013 | 0 | 0 BTronton | 0 | 11-10-2013 | 0 | 0 CJones | 0 | 11-10-2013 | 0 | 0 …

1
SQL仕様ではEXISTS()にGROUP BYが必要ですか?
マイクロソフトでは現在、この構文を許可しています。 SELECT * FROM ( VALUES (1) ) AS g(x) WHERE EXISTS ( SELECT * FROM ( VALUES (1),(1) ) AS t(x) WHERE g.x = t.x HAVING count(*) > 1 ); ノーがあることに注意してくださいGROUP BYにEXISTS句は、その有効なANSI SQLです。それとも単に実装の詳細を公開するだけなのでしょうか。 参考までに、これと同じ構文はPostgreSQLでは許可されていません。 エラー:列 "tx"はGROUP BY句に出現するか、集計関数で使用する必要があります しかし、この構文は許可されています。 SELECT * FROM ( VALUES (1) ) AS g(x) WHERE EXISTS …

2
グループに対して条件が満たされた行を選択(一時テーブルなし)
3列のテーブルがある場合: ID category flag 1 A 1 2 A 0 3 A 0 4 B 0 5 C 0 flag = 1カテゴリごとに少なくとも1回はあるすべての行を選択します。 予期された結果: ID category flag 1 A 1 2 A 0 3 A 0 次のような一時テーブルを使用して解決できます。 select ID into #tempTable from someTable where flag = 1 select * from someTable …

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