【问题标题】:Calculate the sales share per country per day计算每个国家/地区每天的销售份额
【发布时间】:2021-03-15 13:17:40
【问题描述】:

DB-Fiddle

CREATE TABLE sales (
    id SERIAL PRIMARY KEY,
    event_date DATE,
    country VARCHAR,
    sales DECIMAL
);

INSERT INTO sales
(event_date, country, sales)
VALUES 
('2020-02-08', 'DE', '500'),
('2020-02-08', 'FR', '900'),
('2020-02-08', 'NL', '700'),
('2020-03-20', 'US', '600'),
('2020-03-20', 'DE', '500'),
('2020-04-15', 'NL', '300'),
('2020-04-15', 'FR', '800'),
('2020-04-15', 'NL', '100');

预期结果:

event_date  |  country  |    sales_share_per_country_per_day    |
------------|-----------|---------------------------------------|-------------
2020-02-08  |    DE     |     0.24  (=500/2100)                 |  
2020-02-08  |    FR     |     0.43  (=900/2100)                 |
2020-02-08  |    NL     |     0.33  (=700/2100)                 |
------------|-----------|---------------------------------------|-------------
2020-03-20  |    US     |     0.55  (=600/1100)                 |
2020-03-20  |    DE     |     0.45  (=500/1100)                 |
------------|-----------|---------------------------------------|-------------
2020-04-15  |    NL     |     0.25  (=300/1200)                 |
2020-04-15  |    FR     |     0.67  (=800/1200)                 |
2020-04-15  |    NL     |     0.08  (=100/1100)                 |

我想计算每个国家/地区每天的销售份额
因此,我尝试使用此查询:

SELECT
s.event_date,
s.country,
s.sales,
SUM(s.sales) OVER (PARTITION BY s.country) AS sales_share_per_day
FROM sales s
GROUP BY 1,2,3
ORDER BY 1;

但是,我无法达到预期的结果。
你知道我必须如何修改查询吗?


注意:最后我需要这个查询来进行红移。
但是,据我所知,对于窗口函数,redshift 使用 postgresSQL 语法。
因此,我在问题中标记了 redshift 和 postgresSQL。
如果这个假设是错误的,请随时纠正我。

【问题讨论】:

  • 。 .这与您之前提出的问题非常相似。您在这里需要什么与众不同的地方?

标签: sql amazon-redshift


【解决方案1】:

sales_share_per_day 四舍五入到小数点后两位数

CREATE TABLE sales (
    id SERIAL PRIMARY KEY,
    event_date DATE,
    country VARCHAR,
    sales DECIMAL
);

INSERT INTO sales
(event_date, country, sales)
VALUES 
('2020-02-08', 'DE', '500'),
('2020-02-08', 'FR', '900'),
('2020-02-08', 'NL', '700'),
('2020-03-20', 'US', '600'),
('2020-03-20', 'DE', '500'),
('2020-04-15', 'NL', '300'),
('2020-04-15', 'FR', '800'),
('2020-04-15', 'NL', '100');
        SELECT
        s.event_date,
        s.country,
        s.sales,
        round(s.sales/sum(s.sales) OVER (PARTITION BY event_date ),2) AS sales_share_per_day
        FROM sales s
        ORDER BY 1;
event_date country sales sales_share_per_day
2020-02-08 DE 500 0.24
2020-02-08 FR 900 0.43
2020-02-08 NL 700 0.33
2020-03-20 US 600 0.55
2020-03-20 DE 500 0.45
2020-04-15 NL 300 0.25
2020-04-15 FR 800 0.67
2020-04-15 NL 100 0.08

db小提琴here

不四舍五入:

CREATE TABLE sales (
    id SERIAL PRIMARY KEY,
    event_date DATE,
    country VARCHAR,
    sales DECIMAL
);

INSERT INTO sales
(event_date, country, sales)
VALUES 
('2020-02-08', 'DE', '500'),
('2020-02-08', 'FR', '900'),
('2020-02-08', 'NL', '700'),
('2020-03-20', 'US', '600'),
('2020-03-20', 'DE', '500'),
('2020-04-15', 'NL', '300'),
('2020-04-15', 'FR', '800'),
('2020-04-15', 'NL', '100');
        SELECT
        s.event_date,
        s.country,
        s.sales,
        s.sales/sum(s.sales) OVER (PARTITION BY event_date ) AS sales_share_per_day
        FROM sales s
        ORDER BY 1;
event_date country sales sales_share_per_day
2020-02-08 DE 500 0.23809523809523809524
2020-02-08 FR 900 0.42857142857142857143
2020-02-08 NL 700 0.33333333333333333333
2020-03-20 US 600 0.54545454545454545455
2020-03-20 DE 500 0.45454545454545454545
2020-04-15 NL 300 0.25000000000000000000
2020-04-15 FR 800 0.66666666666666666667
2020-04-15 NL 100 0.08333333333333333333

db小提琴here

【讨论】:

  • 仅用于我自己的文档:dbfiddle.uk/…
  • 如果你愿意,你可以将它四舍五入到 0.24 或 0.43 等。祝你好运。
【解决方案2】:

你追求的是这个吗?

SELECT
s.event_date,
s.country,
s.sales,
(
   s.sales 
 / SUM(s.sales) OVER(PARTITION BY event_date)
)::NUMERIC(9,2) AS sales_pct_per_day,
SUM(s.sales) OVER(PARTITION BY event_date) AS sales_share_per_day
FROM sales s
GROUP BY 1,2,3
ORDER BY 1;
event_date  country sales   sales_pct_per_day   sales_share_per_day
2020-02-08  DE      500         0.24                2100
2020-02-08  FR      900         0.43                2100
2020-02-08  NL      700         0.33                2100
2020-03-20  US      600         0.55                1100
2020-03-20  DE      500         0.45                1100
2020-04-15  FR      800         0.67                1200
2020-04-15  NL      300         0.25                1200
2020-04-15  NL      100         0.08                1200

【讨论】:

    猜你喜欢
    • 2020-09-09
    • 2014-06-29
    • 1970-01-01
    • 2016-03-26
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多