sql >> データベース >  >> RDS >> PostgreSQL

with句を持つ2つのクエリを自然に結合するにはどうすればよいですか?

    あなたは物事を複雑にしすぎています。これらの2つのクエリを結合する必要はありません(そして、自然なから離れている必要があります。 参加)、あなたはそれらを組み合わせる必要があるだけです。 min() およびmax() 同じクエリ内で使用できるため、両方を評価するために2つのクエリを実行する必要はありません。

    また、CTE定義をネストする必要はなく、次々に書き込むことができます。

    だからこのようなもの:

    with quant_table as (
      select month, prod, sum(quant) as sum_q
      from sales 
      group by month, prod
    ), min_max as (
      select month, max(sum_q) as max_q, min(sum_q) as min_q
      from quant_table 
      group by month 
    )
    select t1.* 
    from quant_table t1
      join min_max t2 
        on t2.month = t1.month 
       and t1.sum_q in (t2.min_q, t2.max_q)
    order by month, prod;
    

    条件and t1.sum_q in (t2.min_q, t2.max_q) and (t2.max_q = t1.sum_q or t2.min_q = t1.sum_q)と書くこともできます。 。

    上記は、group byを組み合わせることでさらに簡略化できます。 ウィンドウ関数 を使用 単一のクエリで合計、最小、最大の計算を行います:

    with min_max as (
      select month, prod, 
             sum(quant) as sum_q,
             max(sum(quant)) over (partition by month) as max_q,
             min(sum(quant)) over (partition by month) as min_q
      from sales 
      group by month, prod
    )
    select month, prod, sum_q
    from min_max
    where sum_q in (max_q, min_q)
    order by month, prod;
    



    1. テキストファイルソースの接続文字列パラメータ

    2. マルチステートメントテーブル値関数とインラインテーブル値関数

    3. SQLServerからの出力パラメータを使用してOracleストアドプロシージャを呼び出す

    4. フォーラムソフトウェアは、モデレート時にトピック/投稿を文字通り削除する必要がありますか、それとも単に非表示にする必要がありますか?