タグ付けされた質問 「greatest-n-per-group」

6
グループごとにn行を取得する
結果セットの各グループから多くの行を選択する必要がよくあります。 たとえば、顧客ごとに最近の注文値の最高または最低を「n」個リストしたい場合があります。 より複雑な場合、リストする行の数はグループごとに異なる場合があります(グループ化/親レコードの属性によって定義されます)。この部分は間違いなくオプション/追加のクレジットのためであり、人々が答えることを思いとどまらせることを意図していません。 SQL Server 2005以降でこれらのタイプの問題を解決するための主なオプションは何ですか?各方法の主な長所と短所は何ですか? AdventureWorksの例(わかりやすくするため、オプション) TransactionHistoryMからRまでの文字で始まる製品ごとに、テーブルから最新の5つのトランザクション日付とIDをリストします。 繰り返しますが、n製品ごとに履歴行がnあり、DaysToManufacture製品属性の5倍です。 同様に、製品ごとに正確に1行の履歴行が必要な特別な場合(TransactionDate、タイブレークでの最新の単一エントリ)TransactionID。

5
各グループの最初の行を選択する方法は?
このようなテーブルがあります: ID | Val | Kind ---------------------- 1 | 1337 | 2 2 | 1337 | 1 3 | 3 | 4 4 | 3 | 4 私はSELECT、それぞれの最初の行だけを返すようにVal、並べ替えKindます。 サンプル出力: ID | Val | Kind ---------------------- 2 | 1337 | 1 3 | 3 | 4 このクエリを作成するにはどうすればよいですか?

6
「最新の対応する行」を効率的に取得するにはどうすればよいですか?
非常に一般的なクエリパターンがありますが、効率的なクエリを作成する方法がわかりません。別のテーブルの行の「後ではなく最新の日付」に対応するテーブルの行を検索したい。 inventoryたとえば、特定の日に保有する在庫を表すテーブルがあります。 date | good | quantity ------------------------------ 2013-08-09 | egg | 5 2013-08-09 | pear | 7 2013-08-02 | egg | 1 2013-08-02 | pear | 2 そして、「価格」と言うテーブルは、特定の日に財の価格を保持します date | good | price -------------------------- 2013-08-07 | egg | 120 2013-08-06 | pear | 200 2013-08-01 | egg | 110 …

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 …

3
最大日付と最新日付のどちらを選択する
以下に2つのテーブルを示します。 学校職員 SCHOOL_CODE + STAFF_TYPE_NAME + LAST_UPDATE_DATE_TIME + PERSON_ID ================================================================= ABE Principal 24-JAN-13 111222 ABE Principal 09-FEB-12 222111 人 PERSON_ID + NAME ================= 111222 ABC 222111 XYZ これが私のoracleクエリです。 SELECT MAX(LAST_UPDATE_DATE_TIME) AS LAST_UPDATE, SCHOOL_CODE, PERSON_ID FROM SCHOOL_STAFF WHERE STAFF_TYPE_NAME='Principal' GROUP BY SCHOOL_CODE, PERSON_ID ORDER BY SCHOOL_CODE; この結果が得られます LAST_UPDATE SCHOOL_CODE PERSON_ID ===========+===========+========= …


4
主キーで複数の行を返す結合から最初の行を選択する方法
これはこの質問に関連しています: 複数のテーブルを結合すると重複した行が発生します 参加しているテーブルが2つあります。彼らは鍵を共有します。personテーブルには主キーごとに1つの名前がありますが、emailテーブルにはpersonIdごとに複数のメールがあります。1人あたりの最初のメールのみを表示します。現在、メールが複数あるため、1人に複数の行が表示されます。SQL-Server 2005を実行しています。 編集:これはT-SQLです。最初のメールは文字通り、1人あたりの最初のメール行です。 編集2:最初の電子メールは、SQLがクエリを処理するときに結合に表示される最初の電子メール行になります。どのメールが表示されるかは関係ありません。表示されるメールは1つだけです。それがより明確になることを願っています。 Table1: Person Table2: Email Select Person.PersonName, Email.Email From person left join on Person.ID=Email.PersonId;

2
大きなテーブルからグループごとに最大の価値を得るための効率的なクエリ
テーブルが与えられた場合: Column | Type id | integer latitude | numeric(9,6) longitude | numeric(9,6) speed | integer equipment_id | integer created_at | timestamp without time zone Indexes: "geoposition_records_pkey" PRIMARY KEY, btree (id) このテーブルには2000万件のレコードがありますが、比較的多くはありません。ただし、シーケンシャルスキャンが遅くなります。 max(created_at)それぞれの最後のレコード()を取得するにはどうすればよいequipment_idですか? 私はこのトピックの多くの回答を読んだいくつかのバリエーションを使用して、次の両方のクエリを試しました: select max(created_at),equipment_id from geoposition_records group by equipment_id; select distinct on (equipment_id) equipment_id,created_at from geoposition_records order by …

2
PostgreSQLでDISTINCT ONを高速化する方法は?
station_logsPostgreSQL 9.6データベースにテーブルがあります。 Column | Type | ---------------+-----------------------------+ id | bigint | bigserial station_id | integer | not null submitted_at | timestamp without time zone | level_sensor | double precision | Indexes: "station_logs_pkey" PRIMARY KEY, btree (id) "uniq_sid_sat" UNIQUE CONSTRAINT, btree (station_id, submitted_at) それぞれlevel_sensorについてsubmitted_at、に基づいて最後の値を取得しようとしていますstation_id。固有のstation_id値は約400 個、1日あたり約20,000行station_idです。 インデックスを作成する前に: EXPLAIN ANALYZE SELECT DISTINCT ON(station_id) …

1
列の値ごとにSELECT LIMIT 1?
次の表があるとしましょう ----------------------------- | user_id | comment | ----------------------------- | 2 | thats cool | | 2 | awesome | | 3 | i hate this | | 3 | okay | | 6 | this is weird | | 6 | hello? | | 6 | what is it | …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.