MYSQL - 具有独特价值的计数

时间:2014-09-30 09:02:47

标签: mysql

我有这个表例如

IP ADDRESS  | DATE

10.10.10.10 | 2014-09-01    
10.10.10.10 | 2014-09-12    
44.33.33.33 | 2014-09-12    
10.10.10.10 | 2014-09-15    
44.33.33.33 | 2014-09-16    
33.10.31.33 | 2014-09-18    
89.99.11.22 | 2014-09-18
44.33.33.33 | 2014-09-19 
33.10.31.33 | 2014-09-22
10.10.10.10 | 2014-09-24

我想从表中得到的是

TOTAL UNIQUE IP | DATE

1         | 2014-09-01 <-- 10.10.10.10
1         | 2014-09-12 <-- 44.33.33.33
2         | 2014-09-18 <-- 33.10.31.33 and 89.99.11.22

请帮帮我:)。

规则:

  • 第一次访问ipaddress后忽略

  • 抱歉我的英文不好

3 个答案:

答案 0 :(得分:2)

按日期分组的聚合,仅计算不同的IP地址:

SELECT
    COUNT(DISTINCT t1.ip_address),
    t1.date
FROM table t1
WHERE NOT EXISTS(
    SELECT ip_address
    FROM table
    WHERE t1.ip_address = t2.ip_address AND t1.date < t2.date
    LIMIT 1)
GROUP BY t1.date
ORDER BY t1.date

如果您想查看地址:

SELECT
    COUNT(DISTINCT ip_address),
    date,
    GROUP_CONCAT(DISTINCT ip_address)
FROM table
GROUP BY date

答案 1 :(得分:1)

来自@DanFromgermany的精炼答案

SELECT
    COUNT(DISTINCT ip_address),
    date
FROM table t1
where ip_address not in (select ip_address from table t2 where t2.date < t1.date)
GROUP BY date

答案 2 :(得分:0)

SELECT ip_address, MIN(`date`), COUNT(DISTINCT `date`) 
FROM `table`
GROUP BY ip_address;

(顺便说一句,将ip地址存储为虚线四字符串几乎总是一个坏主意)

如果ip地址的数量相对于记录数小(小于2%,取决于表和索引结构),那么NOT EXISTS子句将比这里描述的全表扫描更有效。

相关问题