【发布时间】:2018-05-23 22:58:27
【问题描述】:
我想避免在表格上进行子选择来比较两个时期以及趋势是否下降。
此选择获取一个周期的百分比
SELECT user, (SUM(value1)/SUM(value2)) AS percentage1
FROM table
WHERE (date BETWEEN @start1 AND @end1)
GROUP BY user
ORDER BY 2
这个查询得到了我想要的结果,但是效率不是很高,因为有超过 1 亿行。
SELECT t1.user, (SUM(t1.value1)/SUM(t1.value2)) AS percentage1,
(SELECT (SUM(t2.value1)/SUM(t2.value2)) AS percentage2
FROM table AS t2
WHERE t2.userID = t1.userID
AND (t2.date BETWEEN @start2 AND @end2)
)
FROM table AS t1
WHERE (t1.date BETWEEN @start1 AND @end1)
AND (SUM(t1.value1)/SUM(t1.value2)) < (SELECT (SUM(t2.value1)/SUM(t2.value2))
FROM table AS t2
WHERE t2.userID = t1.userID
AND (t2.date BETWEEN @start2 AND @end2)
)
GROUP BY t1.user
有没有更好的方法来做到这一点?一种解决方案可能是只有一个日期时间段,然后按月(日期)、年(日期)分组并与上个月进行比较,而不是有两个确切的日期。但是按月和年分组只会为每个用户提供几行,我想避免这种情况。
只想要一个像这样干净的结果:
Adam, 43%, 47%
Lisa, 22%, 25%
John, 18%, 34%
排除这样的行,因为趋势百分比较低
Bill, 24%, 18%
Nina, 84%, 56%
SQL-Server 2016 Enterprise 是数据库。
【问题讨论】:
-
样本数据会很棒她,并定义你所有的变量是什么
-
Addeladde 转到 sqlfiddle.com 并设置一个模式供我们使用。您没有提供大量信息或数据集进行评估。
标签: sql sql-server tsql sql-server-2016