postgresql 选择特定年份的哪个月份对销售额贡献最大?

8ulbf1ek  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(167)

我必须生成一个结果集,它返回每年中销售额最高的月份。感兴趣的表是产品表、订单表和日期-时间表。此表结构的当前ERD为x1c 0d1x
这是我的问题我尝试创建一个公共表表达式,它显示存储在数据库中的所有年份和月份的每年每月总销售额,即

`WITH sales_year_and_month AS 
(SELECT 
       year, 
       month, 
       SUM(orders_table.product_quantity * dim_products.product_price_in_£) AS total_sales 
       from public.dim_date_times
       JOIN public.orders_table on public.orders_table.date_uuid = public.dim_date_times.date_uuid
      JOIN public.dim_products on public.dim_products.product_code = public.orders_table.product_code
      GROUP BY year, month
      ORDER BY total_sales DESC)`

字符串
它返回沿着此

的行的内容
现在这个表我想选择出一个特定的一年的月份,这对销售贡献最大?
我尝试了多种方法,仍然没有能够回答如何正确地做到这一点,我想这可能是一个问题,我如何从根本上理解这些主题。有人愿意分享他们将如何处理这个问题吗?

6qftjkof

6qftjkof1#

你可以使用窗口函数如row_number()来选择销售最高的月份。

WITH sales_year_and_month AS 
(
  SELECT t.*,
         ROW_NUMBER() OVER(PARTITION BY dd.year ORDER BY t.total_sales DESC) AS RN
  FROM (
         SELECT dd.year, 
                dd.month, 
                SUM(O.product_quantity * P.product_price_in_£) AS total_sales 
         from public.dim_date_times dd
         JOIN public.orders_table O
           ON O.date_uuid = dd.date_uuid
         JOIN public.dim_products P
           ON P.product_code = O.product_code
         GROUP BY dd.year, 
                  dd.month) t
)
SELECT year,
       month,
       total_sales
FROM sales_year_and_month
WHERE RN = 1

字符串

unhi4e5o

unhi4e5o2#

我相信你是在寻找每年最高销售额的年份,月份和total_sales的列表。使用row_number() over()可以方便地做到这一点。对于每个partition,数字从1开始,order by DESC确定哪一行被分配1(最高销售额)。然后我们只过滤所有等于1的行号。

WITH sales_year_and_month
AS (
    SELECT
          *
        , row_number() OVER (PARTITION BY year ORDER BY total_sales DESC) AS rn
    FROM (
        SELECT
              year
            , month
            , SUM(orders_table.product_quantity * dim_products.product_price_in_ £) AS total_sales
        FROM PUBLIC.dim_date_times
        JOIN PUBLIC.orders_table ON PUBLIC.orders_table.date_uuid = PUBLIC.dim_date_times.date_uuid
        JOIN PUBLIC.dim_products ON PUBLIC.dim_products.product_code = PUBLIC.orders_table.product_code
        GROUP BY year
            , month
        )
    )
SELECT
      year
    , month
    , total_sales
FROM sales_year_and_month
WHERE rn = 1
ORDER BY year

字符串

相关问题