添加列以对唯一id的记录进行计数

xoshrz7s  于 2021-07-26  发布在  Java
关注(0)|答案(4)|浏览(266)

我处理的数据是关于去过某个地方的人的。每个人都有自己的独特之处 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列表中,我才发现这个错误。
我走对了吗?

h9vpoimq

h9vpoimq1#

在sql中使用聚合(sum、count等)时,需要 GROUP BY 条款:

SELECT
    PersonID,
    COUNT(DISTINCT VisitID) as PersonVisits

FROM VisitInfo
WHERE VisitID IS NOT NULL
GROUP BY PersonID
ORDER BY PersonID

根据经验,您的 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

这可能会给您带来奇怪/不正确的结果,因为您的查询很可能会引入重复项,并且由于查询中的值而被紧密地分组 `SELECT` 
i2loujxw

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

7uzetpgm

7uzetpgm3#

将表连接到按personid分组的查询,并返回每个查询的不同visitid数:

SELECT
    t.PersonID,
    t.col1, t.col2, ...,
    t.VisitID,
    g.PersonVisits
FROM VisitInfo t
INNER JOIN (
  SELECT PersonID, COUNT(DISTINCT VisitID) PersonVisits
  FROM VisitInfo
  GROUP BY PersonID 
) g ON g.PesronID = t.PersonID
WHERE t.VisitID IS NOT NULL
ORDER BY t.PersonID, t.VisitID
v6ylcynt

v6ylcynt4#

我就是这样写的。。。

select person_id, demo1, demo2, demo3, count(distinct visitid) as visits
    from visitinfo
    where visitid is not null
    group by 1,2,3,4
    order by 1,2,3,4

相关问题