为 Redshift 构建 SQL 查询的困难

Posted

技术标签:

【中文标题】为 Redshift 构建 SQL 查询的困难【英文标题】:Difficulty in constructing SQL query for Redshift 【发布时间】:2018-11-22 04:42:45 【问题描述】:

我在 SQL 方面没有太多经验,我发现很难为以下问题构建查询。

假设我有如下的每月销售额数据并保存在 Redshift 中

ProductId   Year    Month   Sales
A           2018    1       345
A           2018    2       3425
A           2018    3       56545
A           2018    4       234
A           2018    5       23
B           2018    1       645
B           2018    2       2324
B           2018    3       123
B           2018    4       700
B           2018    5       1410
....
....
....

我想从上表中提取以下信息。简单英语的查询如下所示。

    选择 2018/3 月份销售额大于 800 的产品(分组依据)。对于此查询,应返回产品“A”数据以及 2018/3 月份的销售额

    选择 2018/5 月份销售额比 2018/4 月份高 100% 的产品(分组依据)。这里只匹配产品“B”,结果中应包含两个月的销售数据。

编辑:添加了预期结果。

查询 1

ProductId   Year    Month   Sales
A           2018    3       56545

对于查询 2(分组)

ProductId   Increase    Year    Month   Sales
B           101.42 %    2018    5       1410
                        2018    4       700

【问题讨论】:

您能否编辑您的问题以显示您希望从您显示的输入数据中获得的示例输出? @JohnRotenstein 添加了预期结果。 【参考方案1】:

查询 1:选择 2018/3 月份销售额大于 800 的产品。

SELECT
  productid,
  year,
  month,
  sales
FROM table
WHERE year = 2018
  AND month = 3
  AND sales > 800

查询 2: 选择 2018/5 月份销售额比 2018/4 月份高 100% 的产品。

SELECT
  productid
  a.year as previous_month_year,
  a.month as previous_month,
  a.sales as previous_month_sales,
  b.year as year,
  b.month as month,
  b.sales as sales,
  to_char(100 * b.sales / a.sales,'999D99%') as increase
FROM table a
JOIN table b
WHERE a.year = 2018
  AND b.year = 2018
  AND a.month = 4
  AND b.month = 5
  AND b.sales > a.sales * 2
  AND a.productid = b.productid

我不确定您的要求中的“分组依据”是什么意思,因为不需要聚合。

【讨论】:

关于 group by - 也许我没有正确表达意图。查询将是“我需要知道与给定条件匹配的产品(即 A、B 等)。条件将是“查询 1”或“查询 2”的动态组合例如:SELECT fields WHERE query_1_for(2018 /3) AND query_1_for(2018/5) OR query_2_for(2018/4, 2018/6) AND 以此类推。 我不知道如何看待上述问题的 SQL 方式,但在我看来,我认为这样的查询 - 每个产品每个月的销售额都有一行。所以我的想法是按 product_id 对行进行分组,并在每个组内应用条件。如果所有条件都为真,则选择该产品。我在这里想象一个树形结构(从 JSON / NO-SQL 世界悬停) 上述查询应提供您在问题中列出的预期输出。你现在是说这不是你真正想要的输出吗?如果是这样,请更新您的问题,或创建一个新问题。【参考方案2】:

您可以尝试以下查询

select * from tablename
where year=2018 and month=3 and and Sales>800

select * from tablename where year=2018 and month in (4,5)
and (case when year=2018 and month=5 then sales end)>(case when year=2018 and month=4 then sales end)*2

【讨论】:

关于第二个查询。如何在产品 ID 相同的情况下进行比较。例如,在第二个查询中,产品 A 2018/5 月份的销售额可以与 B 产品 2018/4 月份的销售额进行比较。但是产品 A 的销售额应该在不同的月份与它本身进行比较。

以上是关于为 Redshift 构建 SQL 查询的困难的主要内容,如果未能解决你的问题,请参考以下文章

将原始 SQL 转换为 Laravel 查询构建器

Redshift SQL 查询 - 优化

如何运行存储在 Redshift 表中的 SQL 查询

read_sql 和 redshift 在 unicode 上给出错误

AWS Redshift SQL - PIVOT 查询(一行/行多次计数)

带子查询的redshift sql查询中的语法错误