将两个查询合并为一个而不使用临时表

时间:2019-01-16 23:15:38

标签: sql

我想用mincall代替callzero。我从第一个查询中获得mincall,从第二个查询中获得callzero。我该如何合并这些查询,而不必使用临时表?

select CONVERT(datetime, convert(varchar(10), min(CALENDAR))) as mincal 
from STATS
group by clientid

然后:

select CONVERT(datetime, convert(varchar(10), min(CALENDAR))) as callzero, CLIENTID from STATS
where calls = 0
and CONVERT(datetime, convert(varchar(10), CALENDAR)) < getdate()-2
group by clientid

更新

我将这些查询合并如下-

select b.CLIENTID from
(
    select CONVERT(datetime, convert(varchar(10), min(CALENDAR))) as mincal
    from STATS
    group by CLIENTID
) a,
(
    select CONVERT(datetime, convert(varchar(10), min(CALENDAR))) as callzero, CLIENTID
    from STATS
    where calls = 0 and CONVERT(datetime, convert(varchar(10), CALENDAR)) < getdate()-2
    group by clientid
) b
group by clientid

但是,如果他们不在group by子句中,我仍然无法从mincall中减去callzero

更新2

日历字段的格式为yyyymmdd。例如,20170922

1 个答案:

答案 0 :(得分:0)

我相信您可以使用条件聚合在一个简单的语句中简化您的查询。

考虑:

SELECT  
    clientid, 
    MIN(calendar) as mincal 
    MIN(CASE WHEN calls = 0 AND calendar < getdate()-2 THEN calendar END) as callzero,
    DATEDIFF(
        DAY,
        MIN(CASE WHEN calls = 0 AND calendar < getdate()-2 THEN calendar END),
        MIN(calendar)
    ) as date_interval 
FROM (
    SELECT 
        clientid, 
        CONVERT(datetime, convert(varchar(10), calendar)) calendar
    FROM STATS
)
GROUP BY clientid

注意:

  • 我了解到CALENDAR中的日期存储为整数,因此进行了两次转换。为了限制转换次数,我将其移至子查询。

  • 在第三列中,仅考虑最近两天内具有calls = 0calendar的行;对于其他行,CASE语句返回NULL,而MIN聚合函数基本上将其忽略。

  • 在sql-server中,DATE_DIFF可用于减去日期(此处,查询返回两个计算出的日期之间的天数)