我甚至不确定我是否正确地提出了这个问题。从算法上讲,我知道自己想做什么,但不知道SQL中的相应语法。
我创建了一个表,其中包含按客户编号,IP,会话开始时间和总会话长度计算的总在线会话时间。下面是这个表的示例(ip和CustNo被屏蔽,也不确定如何使表格如此原谅古怪):
CustNo minDate maxDate ClientIp timeDiff
123456 2017-11-14-02:39:27.093 2017-11-14-02:39:59.213 1.1.1.1 0.000372
然后,我创建另一个表,查找特定类型的活动,并想知道此特定用户在此特定活动之前使用该IP的时间。第二个表将每个活动包含为单独的行,customerID,IP和时间戳。
到目前为止没有问题,表格看起来很好。
我现在需要根据客户ID和IP编写将查看第一个表的部分,然后在会话最小开始时间小于活动时间的情况下总结该客户的所有IP使用情况,但我有不知道怎么做。这是当前的功能(显然不起作用)。我正在进行左连接,因为它可能是一个新的IP,它可能不在第一个表中。
SELECT
*,
SUM(##finalSessionSums.timeDiff)
FROM
##allTransfersToDiffReceip
LEFT JOIN
##finalSessionSums ON ##allTransfersToDiffReceip.CustNo = ##finalSessionSums.CustNo
AND ##allTransfersToDiffReceip.ClientIp = ##finalSessionSums.ClientIp
AND ##allTransfersToDiffReceip.[DateTime] < ##finalSessionSums.minDate
我在这里得到了一个聚合函数错误,但我根本不知道如何处理它。
答案 0 :(得分:1)
您有SELECT *(返回所有列)和聚合函数(在本例中为SUM
)。每当您将特定列与聚合,汇总值组合在一起时,您需要规定SELECT
子句中GROUP BY
子句中指定的每个列。例如
SELECT
A, B, SUM(C) as CSum
FROM
Table
GROUP BY
A, B
答案 1 :(得分:0)
由于信息很少,我无法提供完美的解决方案,但我会试一试:
首先,就像Alan提到的那样,你必须只选择聚合函数所需的列,即CustommerNo和Ip。要获得查询的总和,您必须将其分组如下:
{{1}}