是否可以在不使用 SQL 连接的情况下对不同年份进行每周比较?

Posted

技术标签:

【中文标题】是否可以在不使用 SQL 连接的情况下对不同年份进行每周比较?【英文标题】:Is it possible to do Week to Week comparison for different years without using join in SQL? 【发布时间】:2018-08-16 09:45:41 【问题描述】:

现在我有一个表,我们称它为table a,如下

Country    date        year   week   visits   orders   CVR_visitToOrder
   US      2018-08-05  2018   33     1000     100      0.1
   DE      2018-08-05  2018   33     1500     150      0.1
   US      2017-08-06  2017   33     1200     60       0.05
   DE      2017-08-06  2017   33     800      20       0.025           

现在我想比较不同年份之间同一日历周的转化率。所以我所做的是,我使用 with 语句再次加入自身并查看差异,例如

With a as (
  Select 
    Country,date,year,week,visits,orders,CVR_visitToOrder
  FROM
    db.table
)

SELECT 
  *
FROM 
  a
LEFT JOIN a as a1
  ON a.Country = a1.Country 
  AND a.week = a1.week
  AND a.year = a1.year - 1 

为了优化查询,如果我想让它更直接,即像vlookup函数一样,查找去年的同一周并返回访问,订单和CVR,还有其他替代方法吗? 非常感谢

【问题讨论】:

【参考方案1】:

我不确定您的数据中的“对话率”是什么意思。但是你的问题的答案是你可以使用窗口函数。

例如,要获取上一年的访问量:

select country, year, visits, week,
       lag(visits) over (partition by country, week order by year) as prev_visits
from t;

这假设所有年份的所有周都可用。

如果您想比较两个特定年份,那么条件聚合是另一种可能性。

【讨论】:

【参考方案2】:

可能你需要一个类似于以下问题的滚动差异

试试这个。使用相关子查询查找滚动差异

CREATE TABLE #tem
  (SKU      INT,DataDate DATETIME,Web_qty  INT)

INSERT #tem
VALUES( 2,'2014-11-17 00:00:00',404),
       (2,'2014-11-18 00:00:00',373),
       (2,'2014-11-19 00:00:00',1350),
       (66,'2014-11-17 00:00:00',3624),
       (66,'2014-11-18 00:00:00',3576),
       (66,'2014-11-19 00:00:00',3570),
       (67,'2014-11-17 00:00:00',9353),
       (67,'2014-11-18 00:00:00',9297),
       (67,'2014-11-19 00:00:00',9250)

SELECT *,
       Web_qty - (SELECT Web_qty
                  FROM   #tem a
                  WHERE  a.sku = b.SKU
                         AND a.DataDate = Dateadd(dd, -1, b.DataDate)) Roll_diff
FROM   #tem b 

SQL Query to Calculate the Rolling Difference by Date

【讨论】:

以上是关于是否可以在不使用 SQL 连接的情况下对不同年份进行每周比较?的主要内容,如果未能解决你的问题,请参考以下文章

SQL:如何在不覆盖结果的情况下对表的同一列进行多次连接?

如何在不使用 Spark SQL 的情况下对 Spark 中的数据帧进行排序?

如何在不使用 GROUP BY 或 PARTITION BY 的情况下对 Oracle SQL 中的数据进行分组

如何在不使用乘法的情况下对数字进行平方?

如何在不单独指定所有列的情况下对所有列的 SQL 结果进行排序?

在不使用操作的情况下对 Spark 进行基准测试