是否可以在不使用 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 连接的情况下对不同年份进行每周比较?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 Spark SQL 的情况下对 Spark 中的数据帧进行排序?
如何在不使用 GROUP BY 或 PARTITION BY 的情况下对 Oracle SQL 中的数据进行分组