1

テーブル グループ ID から最大値と最小値の両方を取得するクエリを作成しようとしています。基本的に、既存の contract_id から新しい年間金額の更新を追加するテーブルがあります。

customer_id | コントラクト_id | 開始日 | 終了日 | 収益
6 | 125 | 2012-01-01 | 2012-12-31 | 10,000
6 | 126 | 2012-01-01 | 2013-12-31 | 5,000
6 | 125 | 2013-01-01 | 2013-12-31 | 12,000
6 | 126 | 2014-01-01 | 2015-12-31 | 8,000

最小の start_date、最大の end_date、およびその end_date に対応する収益を、特定の customer_id の contract_id でグループ化して取得したいもの。

したがって、クエリは理想的には次を返します。

customer_id | コントラクト_id | 開始日 | 終了日 | 収益
6 | 125 | 2012-01-01 | 2013-12-31 | 12,000
6 | 126 | 2012-01-01 | 2015-12-31 | 8,000

最大のものを取得できますが、同じクエリで MAX と MIN の両方を取得するのに問題があります。どんな助けでも大歓迎です。ありがとう!

4

2 に答える 2

1

このクエリを試してみてください。検証用のスクリーンショットも参照してください (画像 1 を参照) 。

SELECT r.`contract_id`,r.`start_date`,
(SELECT sub_r.`end_date` FROM `table` sub_r where sub_r.`contract_id` = r.`contract_id` 
ORDER BY sub_r.`revenue` DESC limit 1 )
AS `end_date`,
(SELECT sub_r.`revenue` FROM `table` sub_r where sub_r.`contract_id` = r.`contract_id` 
ORDER BY sub_r.`revenue` DESC limit 1 )
AS `revenue` 
FROM `table` r GROUP BY r.`contract_id`;

画像1

ここに画像の説明を入力

于 2012-05-12T20:52:14.843 に答える
1

ユニオンを使用して、クエリを 2 つの半分 (「最大」用と「最小用」) に分割できるようにします。最小関数の最大値は使用しないでください。代わりにターゲット フィールドでデータを並べ替え、一番上の行を取得します。

select * from (
  select * from mytable
  where customer_id = ?
  order by start_date, created_at
  limit 1) x
union all
select * from (
  select * from mytable
  where customer_id = ?
  order by end_date desc, created_at desc
  limit 1
) y

注: 「最小」行と「最大」行が同じ行であっても、常に 2 行が返されます (顧客の行が 1 行しかない場合)。

編集:

また、タイを破るために注文するcreated_at(後で追加されたコメントより)

于 2012-05-12T19:31:18.077 に答える