复杂存储过程中的if-then-else构造

me

我对sql查询还比较陌生,我想知道如何创建一个复杂的存储过程。我的数据库在SQL Server上运行。

我有一个表customer(id,名称)和一个表customer_events(id,customer_id,时间戳,action_type)。我想将计算的字段customer_status添加到表customer,这是

  • 0 :(如果customer_events中没有此客户的事件)或(最近的事件是> 5分钟前)
  • 1:如果最近的事件是<5分钟前且action_type = 0
  • 2:如果最近的事件是<5分钟前且action_type = 1

我可以使用if-then-else构造还是应该以其他方式解决这一难题?

杰米茨

正如您在评论中提到的那样,您实际上是想向选择查询中添加一个字段,并且从一般意义上说,您想要的是一条CASE语句。他们的工作方式如下:

SELECT field1, 
       field2,
       CASE
         WHEN some_condition THEN some_result
         WHEN another_condition THEN another_result
      END AS field_alias
FROM table

应用于您的特定方案,这并不是完全简单的。当然,left join将需要状态表,并且还希望聚合以查找最新事件以及该事件的操作类型。获得这些信息后,案例陈述就很简单。

在不访问您的数据的情况下,总是很难编写sql,但是类似:

SELECT c.id, 
       c.name,
       CASE 
          WHEN e.id IS NULL OR DATEDIFF(minute,e.timestamp,getDate())>=5 THEN 0
          WHEN DATEDIFF(minute,e.timestamp,getDate())<5 AND s.action_type=1 THEN 1
          WHEN DATEDIFF(minute,e.timestamp,getDate())<5 AND s.action_type=0 THEN 2
       END as customer_status
FROM clients c
LEFT JOIN (
    SELECT id, client_id, action_type, 
           rank() OVER(partition by client_id order by timestamp desc) AS r
    FROM customer_events
) e
ON c.id=e.client_id AND e.r=1

其核心是中间的子查询,它使用rank功能client_id按时间戳降序为每个状态赋予一个数字因此,排名为的每条记录1都是最新的(对于该客户)。之后,您只需将其连接到客户端表,并使用它来确定正确的值即可customer_status

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

存储过程中的IF / ELSE性能

来自分类Dev

存储过程中的IF / ELSE性能

来自分类Dev

SQL Server:存储过程中的IF THEN ELSE

来自分类Dev

在存储过程中的 SELECT STATEMENT 中使用 IF ELSE CONDITION

来自分类Dev

在构造注入过程中为具有领先优势的Singleton存储库更新连接信息

来自分类Dev

在存储过程中添加 if else 条件并返回硬编码值?

来自分类Dev

如何在SQL Server存储过程中使用if / else

来自分类Dev

在存储过程中使用if / else进行计算

来自分类Dev

为什么局部变量在if-else构造中而不在if-else-if构造中启动?

来自分类Dev

构造std :: thread对象的过程中的详细信息

来自分类Dev

构造std :: thread对象的过程中的详细信息

来自分类Dev

在存储过程中调用存储过程

来自分类Dev

存储过程中的更新

来自分类Dev

存储过程中的交易

来自分类Dev

存储过程中的递归

来自分类Dev

存储过程中的IF条件

来自分类Dev

存储过程中的SUM

来自分类Dev

存储过程中的if语句

来自分类Dev

#TempTable 在存储过程中

来自分类Dev

在大型if / else构造中调用函数/类的好方法

来自分类Dev

在大型if / else构造中调用函数/类的好方法

来自分类Dev

在以下if-else if-else if结构的构造中,进行了1或3个比较?

来自分类Dev

为什么反序列化过程中没有调用默认构造函数?

来自分类Dev

Javascript对象可以在构造过程中调用自己的方法吗?

来自分类Dev

表单在构造过程中从默认实例引用了自身,这导致了无限递归

来自分类Dev

在构造过程中应用type_id运算符

来自分类Dev

无法在存储过程中调用存储过程

来自分类Dev

存储过程SQL Server中IF ELSE的替代方法

来自分类Dev

在存储过程中显示消息

Related 相关文章

热门标签

归档