我对sql查询还比较陌生,我想知道如何创建一个复杂的存储过程。我的数据库在SQL Server上运行。
我有一个表customer(id,名称)和一个表customer_events(id,customer_id,时间戳,action_type)。我想将计算的字段customer_status添加到表customer,这是
我可以使用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] 删除。
我来说两句