试图获得第一个访问日期

时间:2013-08-20 14:00:00

标签: sql-server sql-server-2008 tsql

我正在尝试对特定数据集进行日常分析。该表如下所示:

custNo  visitTime          FirstVisit

1234    2013-01-31 20:15  
1234    2013-01-31 22:30
1234    2013-02-15 02:30
1234    2013-02-15 06:30
1234    2013-02-15 11:30
1234    2013-02-15 21:30

我正在尝试使用Daily analysis进行一些custNo。如您所见,客户编号重复。一天是2013-01-31 1:00am2013-02-01 00:59am。我想提出FirstVistTime的查询。因此对于31st Jan,它应该是2013-01-31 20:15,对于15th Feb,它应该是2013-02-15 02:30

到目前为止,我提出了这个问题:

select custNo, visitTime, FirstVisit=(select MIN(c.visitTime) FROM customer c  where
(c.custNo=ct.custNo and c.visitTime >= '01/01/2013 01:00' and c.visitTime < '03/01/2013 
01:00') 
from customer ct 
where visitTime >= '01/01/2013 01:00' 
    and visitTime < '03/01/2013 01:00' 

这个问题是 - 如果custNo重复,它会考虑所有行并计算最小日期,在上述情况下将是2013-01-31 20:15。我尝试使用min(visitTime)over(partition by custNo,visitTime)。好吧,subquery返回两个值。

3 个答案:

答案 0 :(得分:1)

试试这个:

select custNo, min(visitTime) from customer 
group by custNo, CAST(visitTime AS date)
order by custNo

或:

select t1.custNo, t1.visitTime, t2.minVal 
from customer t1 left join 
(
  select custno, min(visitTime) as minVal  from customer 
  group by custno, CAST(visitTime AS date)      
) t2 on t1.custNo = t2.custNo and CAST(t2.minVal as date) = CAST(t1.visitTime as date)
order by t1.custNo

答案 1 :(得分:0)

实际上,您应该能够按客户和日期进行分组,并为每个客户和日期选择最短访问时间:

SELECT custNo, MIN(visitTime)
FROM customer c
GROUP BY custNo, CONVERT(DATE, visitTime, 112)
ORDER BY custNo, MIN(visitTime)

答案 2 :(得分:0)

这是你要找的吗?

SELECT custno, min(visit)
FROM visitors
GROUP BY custno, CONVERT(DATE, VISIT)
ORDER BY custno, min(visit)

这是SQLFiddle