繁体   English   中英

T-SQL对子查询运行多个查询

[英]T-SQL Run multiple queries against a subquery

我有一个针对用户及其要求的简单数据模型:

User
- id,
- name

Request
- id,
- createdAt,
- completedAt,
- status
- userId (FK to user)

我正在尝试运行一个查询,该查询为每个用户收集一些统计信息。 问题是我必须运行相同的子查询才能为我选择的每个参数获取用户请求。 相反,我想运行一次,然后计算它的一些统计信息。

select
 u.id as UserId,
 (select count(*) 
  from Requests r 
  where userId = u.id 
      and timestamp > @dateFrom) as Total,
 (select count(*) 
  from Requests r 
  where userId = u.id 
      and timestamp > @dateFrom
      and status = N'Completed') as Completed,
 (select status
  from Requests r 
  where userId = u.id 
      and timestamp > @dateFrom
      and status != N'Completed') as ActiveStatus,
  (select datediff(second, createdAt, completedAt)
   from Requests r 
   where userId = u.id 
      and timestamp > @dateFrom
      and status == N'Completed') as AvgProcessingTime
from User u

显然,此查询非常慢,我需要对其进行优化。 我尝试了加入,申请,排名,但对我来说,没有什么能解决的(因为我无法完成所有必需统计信息的查询)。

从性能的角度来看,最好的方法是什么?

尝试使用左联接和聚合

这里可能有几个问题,但请告诉我您的情况。

select
 u.id as UserId
 ,count(r.UserId) [Total]
 ,sum(iif(r.status = N'Completed',1,0)) [Completed]
 ,sum(iif(r.status <> N'Completed',1,0)) [ActiveStatus]
 ,avg(iif(r.status = N'Completed', datediff(second, createdAt, completedAt),0)) [AvgProcessingTime]
from User u
left join Request R
where timestamp > @datefrom
and r.userId = u.id
group by 
u.id

我不确定此查询的原因,因为我尚未在计算机上运行它,但是您可以尝试一下并根据需要进行一些更改-

SELECT U.ID AS USERID
,COUNT(R.ID) AS TOTAL
,SUM(CASE 
        WHEN R.[STATUS] = N'COMPLETED'
            THEN 1
        END) AS [COMPLETED]
,CASE 
    WHEN R.[STATUS] <> N'COMPLETED'
        THEN [STATUS]
    END AS [ACTIVE STATUS]
,CASE 
    WHEN R.[STATUS] = N'COMPLETED'
        THEN DATEDIFF(SECOND, CREATEDAT, COMPLETEDAT)
    END AS [AVG PROCESSING TIME]
FROM USERS U
LEFT JOIN REQUESTS R ON U.ID = R.USERID
WHERE TIMESTAMP > @DATEFROM

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM