Sql 更新上周的记录
我正在生成一个报告,需要显示上周每小时有多少用户从帐户状态1升级到帐户状态2(并删除升级=0的小时数)。我的表有一个更新日期,但是不能确定帐户状态是否是正在更新的项目(可能是联系信息等) 下面是我正在使用的基本表配置。还有其他列,但我的查询不需要它们 帐户id、帐户状态、更新日期 我最初的想法是先过滤并查看本周的数据,然后确定它们是否处于account_status=1,然后再查看account_status=2Sql 更新上周的记录,sql,sql-server,Sql,Sql Server,我正在生成一个报告,需要显示上周每小时有多少用户从帐户状态1升级到帐户状态2(并删除升级=0的小时数)。我的表有一个更新日期,但是不能确定帐户状态是否是正在更新的项目(可能是联系信息等) 下面是我正在使用的基本表配置。还有其他列,但我的查询不需要它们 帐户id、帐户状态、更新日期 我最初的想法是先过滤并查看本周的数据,然后确定它们是否处于account_status=1,然后再查看account_status=2 解决这个问题的最佳方法是什么?这是一种使用自联接的方法。在没有任何示例数据的情况下
解决这个问题的最佳方法是什么?这是一种使用自联接的方法。在没有任何示例数据的情况下,很难准确地说出如何做到这一点,但希望您至少可以在此基础上进行构建。关于如何编写成功的自连接,有很多教程,如果您遇到困难,我会参考这些教程
select a.account_id
from tableName a, tableName b
where a.account_id= b.account_id
and
(a.DateModified > 'YYYY-MM-DD' and a.account_status = 1)
and
(b.DateModified < 'YYYY-MM-DD' and b.account_status= 2)
选择一个帐户\u id
从表名a到表名b
其中a.account\u id=b.account\u id
和
(a.DateModified>“YYYY-MM-DD”和a.account\u status=1)
及
(b.DateModified<'YYYY-MM-DD'和b.account\u status=2)
也许您可以尝试对所有比更新早的更新进行排名,按时间戳递减,帐户的状态为2。检查是否存在状态为1且等级为1的条目,以了解相应的较新更新是否将状态从1更改为2
SELECT *
FROM elbat t1
WHERE t1.account_status = 2
AND EXISTS (SELECT *
FROM (SELECT rank() OVER (ORDER BY t2.updated_date DESC) r,
t2.account_status
FROM elbat t2
WHERE t2.account_id = t1.account_id
AND t2.updated_date <= t1.updated_date) x
WHERE x.account_status = 1
AND x.r = 1);
如果您经常使用和/或性能很重要,您可以考虑为代码< >转换(…)>代码>和<代码> DATEPART(…)>代码>表达式引入持久化、计算和索引的列,并在查询中使用它们。为日历/时间表和子查询中使用的列编制索引也值得考虑
(免责声明:由于您未提供表的DDL或任何样本数据,因此这完全未经测试。)您的描述没有问题,但带预期结果的格式化样本数据是提出问题的首选方式。您好,欢迎来到StackOverflow!作为一条建议,关于StackOverflow的最佳问题是那些在特定问题上表现出尝试或寻求帮助的问题。目前,您的问题可以解释为请求某人为您编写代码,这有点令人不快。请花一点时间熟悉并编辑您的问题,以包括您自己的尝试,或指定您自己难以完成的部分。
DECLARE @current_time datetime = getdate();
DECLARE @current_hour datetime = dateadd(hour,
datepart(hour,
@current_time),
convert(datetime,
convert(date,
@current_time)));
DECLARE @hours
TABLE (hour datetime);
DECLARE @interval_size integer = 7 * 24;
WHILE @interval_size > 0
BEGIN
INSERT INTO @hours
(hour)
VALUES (dateadd(hour,
-1 * @interval_size,
@current_hour));
SET @interval_size = @interval_size - 1;
END;
SELECT *
FROM @hours h
INNER JOIN (SELECT *
FROM elbat t1
WHERE t1.account_status = 2
AND EXISTS (SELECT *
FROM (SELECT rank() OVER (ORDER BY t2.updated_date DESC) r,
t2.account_status
FROM elbat t2
WHERE t2.account_id = t1.account_id
AND t2.updated_date <= t1.updated_date) x
WHERE x.account_status = 1
AND x.r = 1)) y
ON convert(date,
y.updated_date) = h.convert(date,
h.hour)
AND datepart(hour,
y.updated_date) = datepart(hour,
h.hour);