1

我需要一个查询来获取文件的下载次数。表是这样的

fid  uid        ip
21    0      111.111.111.11
21    0      222.222.222.22
21    0      111.111.111.11
21    1      333.333.333.33
21    1      111.111.111.11
21    1      444.444.444.44
21    2      555.555.555.55
22    0      111.111.111.11

uid 是用户 id,如果它是 0,则用户是匿名的。查询应计算 fid 为 21 的行数,但如果用户是匿名的,则具有不同的 ips 值,如果用户是注册的,则具有不同的用户和 ips 值。(如果用户下载文件,注销,然后以匿名身份再次下载,则查询应将此计为 1 次下载)

在这个例子中,查询应该像这样计算

fid  uid        ip
21    0      111.111.111.11
21    0      222.222.222.22
21    1      333.333.333.33
21    2      555.555.555.55

结果应该是4。

任何帮助深表感谢。

编辑:我删除了一些描述,因为它令人困惑。感谢所有评论和可能的解决方案。

4

4 回答 4

1

这个查询得到你想要的分组,除了我不知道333.333.333.33应该返回的业务规则uid=1。我选择使用MAX(ip)

select distinct t.uid, t.ip
from MyTable t
inner join (
  select uid, max(ip) maxip
  from MyTable
  where fid = 21
  group by uid
) tm on t.uid = tm.uid
and ((t.uid <> 0 and t.ip = tm.maxip) or t.uid = 0)
where t.fid = 21

SQL 小提琴示例 #1

然后,您可以将其包装在一个计数中,如下所示:

select count(*)
from (
  select distinct t.uid, t.ip
  from MyTable t
  inner join (
    select uid, max(ip) maxip
    from MyTable
    where fid = 21
    group by uid
  ) tm on t.uid = tm.uid
  and ((t.uid <> 0 and t.ip = tm.maxip) or t.uid = 0)
  where t.fid = 21
) a

SQL 小提琴示例 #2

于 2012-07-22T16:55:26.997 回答
0

应该是这样的:

    SELECT count(distinct ip) FROM table WHERE fid = 21;
于 2012-07-22T16:38:31.097 回答
0

您的解释和您的示例数据不相关,您声明“如果他们已注册,则用户和 ips 的不同值”,但您的示例数据注册用户尽管拥有不同的 IP,但仅显示一次。根据您的示例数据,这将起作用:

SELECT  COUNT(DISTINCT CASE WHEN UID = 0 THEN IP ELSE CAST(UID AS VARCHAR) END) AS UniqueDownloads,
        COUNT(*) AS TotalDownloads
FROM    T
WHERE   FID = 21

但是根据您的描述,这将起作用:

SELECT  COUNT(*) AS UniqueDownloads,
        SUM(Downloads) AS TotalDownloads
FROM    (   SELECT  UID, IP, COUNT(*) AS Downloads
            FROM    T
            WHERE   FID = 21
            GROUP BY UID, IP
        ) T
于 2012-07-22T16:56:28.960 回答
0

以下查询应该满足您的需要:

select fid, count(*) as uipcount, sum(rowcount) as rowcount
from (select fid, userid, ip, count(*) as rowcount
      from t
      where fid = 21
      group by fid, userid, ip
     ) tsum
group by fid

字段 uipcount 是您要查找的内容。作为奖励,它还包括原始数据中的总行数。

顺便说一句,您的条件“如果用户是匿名的,则具有不同的 ips 值,如果用户是注册的,则具有不同的用户和 ips 值”相当于“每个人的用户和 ips 的不同值”。所有匿名用户都具有相同的用户 ID,因此将他们的用户 ID 包含在不同的用户 ID 中并没有什么区别。

于 2012-07-22T16:40:11.193 回答