我处理的数据是关于去过某个地方的人的。每个人都有自己的独特之处 PersonID
他们的每一次访问都有一个独特的 VisitID
. 我想做的是在我的查询中添加一列,统计每个人的不同记录数(即统计并显示该人访问的次数)。这种逻辑在我脑子里是有道理的,但我对语法不太确定,我在研究时看到的类似问题还没有完全适用于我的情况。
下面是我看到的:
SELECT
PersonID,
[a few other demographic fields we'll skip for now],
VisitID,
COUNT(DISTINCT VisitID) as PersonVisits
FROM VisitInfo
WHERE VisitID IS NOT NULL
ORDER BY PersonID, VisitID
我希望看到这样的结果:
PersonID ... VisitID PersonVisits
------------------------------------------------
1001 ... 0277 2
1001 ... 1429 2
1002 ... 1103 1
1003 ... 0925 3
1003 ... 2276 3
1003 ... 5018 3
我知道 PersonVisits
count只会对给定的每个人的记录重复一次,但这是我可以在本项目中处理的事情(除非有人对如何改进查询的这方面有任何建议)。
我的主要问题是
我不确定我所做的是不是正确的方法
和
从现在的情况来看,这个查询给了我一个错误
列personid在选择列表中无效,因为它不包含在聚合函数或group by函数中。
直到我把count函数添加到select列表中,我才发现这个错误。
我走对了吗?
4条答案
按热度按时间h9vpoimq1#
在sql中使用聚合(sum、count等)时,需要
GROUP BY
条款:根据经验,您的
SELECT
必须在GROUP BY
```SELECT
PersonID,
[a few other demographic fields we''ll skip for now],
VisitID,
COUNT(DISTINCT VisitID) as PersonVisits
FROM VisitInfo
WHERE VisitID IS NOT NULL
GROUP BY
PersonID,
[a few other demographic fields we'll skip for now],
VisitID,
ORDER BY PersonID, VisitID
i2loujxw2#
另一个选择是window函数
sum() over()
```SELECT PersonID,
VisitID,
PersonVisits = sum(1) over (partition by PersonID)
FROM VisitInfo
WHERE VisitID IS NOT NULL
ORDER BY PersonID, VisitID
7uzetpgm3#
将表连接到按personid分组的查询,并返回每个查询的不同visitid数:
v6ylcynt4#
我就是这样写的。。。