我想用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
。
答案 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 = 0
和calendar
的行;对于其他行,CASE
语句返回NULL
,而MIN
聚合函数基本上将其忽略。
在sql-server中,DATE_DIFF
可用于减去日期(此处,查询返回两个计算出的日期之间的天数)