Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新上周的记录_Sql_Sql Server - Fatal编程技术网

Sql 更新上周的记录

Sql 更新上周的记录,sql,sql-server,Sql,Sql Server,我正在生成一个报告,需要显示上周每小时有多少用户从帐户状态1升级到帐户状态2(并删除升级=0的小时数)。我的表有一个更新日期,但是不能确定帐户状态是否是正在更新的项目(可能是联系信息等) 下面是我正在使用的基本表配置。还有其他列,但我的查询不需要它们 帐户id、帐户状态、更新日期 我最初的想法是先过滤并查看本周的数据,然后确定它们是否处于account_status=1,然后再查看account_status=2 解决这个问题的最佳方法是什么?这是一种使用自联接的方法。在没有任何示例数据的情况下

我正在生成一个报告,需要显示上周每小时有多少用户从帐户状态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);