【问题标题】:Counting new entries in SQL计算 SQL 中的新条目
【发布时间】:2017-09-21 00:32:01
【问题描述】:

我正在做一个项目,我正在搜索 wifi 探测信号(来自手机等)。它会检测 wifi 传感器半径内的每个 mac 地址。然后将该数据从服务器发送到数据库,该数据库使用报告工具显示统计数据。这可以在商店中用于研究客户行为。

这是数据的样子:

ID:这是直截了当的,它是自动递增的

sensorid:使用的传感器的ID(我们使用3个传感器将信号强度以dBm为单位转换为米,然后可以计算到地图上的位置)

time: 进入unix的时间

address:检测到的已哈希mac地址(出于隐私原因哈希)

meanmax:以 dBm 为单位的信号强度

nr_packets: 收到的数据包数

oui:oui(mac地址前6个字符)

问题是,我想知道哪些条目是新的,哪些条目已经存在。然后我想在如下表中显示它。

它应该看起来像这样:

New customer | Existing customer
--------------------------------
*Amount*     | *Amount*

P.s 如果有任何遗漏的信息,请评论。我是论坛的新手。

【问题讨论】:

  • “我想创建一个表格或图表,以显示客户是新客户还是现有客户。”这太模糊了。更好地解释你想做什么。
  • 我想创建一个表格,就像上面的预览一样,显示一个条目是新的还是已经存在的。然后我想在上面的表格中计算这两件事。我希望这能解决问题,英语不是我的主要语言;)
  • 您的问题甚至没有定义客户是什么。
  • 在这种情况下,客户是上面屏幕截图中指定的地址
  • 再创建一张表并通过mac地址等参数存储唯一用户,并在此处创建一列计数。每次您将用户添加到 count +1 时,如果 count = 1 则其新用户仅在这里一次,如果 count > 1 则不是新用户

标签: mysql sql phpmyadmin counting


【解决方案1】:

嗯,你有一种相当奇怪的定义新的和现有的。根据您所说,新客户是表中仅出现一次的客户。不管是今天、昨天还是二十年前。

使用COUNTGROUP BY address 获取每位客户的计数。如果为 1,则客户是“新客户”。

select what, count(*)
from
(
  select 
    address, 
    case when count(*) = 1 then 'new' else 'existing' end as what
  from mytable
  group by address
) new_or_old
group by what;

【讨论】:

  • 这行得通。非常感谢您的努力和良好的解释。
  • 这不是一个很好的问题,但你绝对值得称赞。
  • 他做到了。很抱歉我的问题不够清楚
【解决方案2】:

评论太长了。

鉴于您的数据库和问题,数据集中的每个客户在某个时候都是客户。因此,您的问题相当于:“我有多少唯一客户”和“多少条记录”。

这很简单:

select count(distinct address) as numCustomers, count(*) as numRecords
from t;

我真的不认为这是你想要的,但它是你所问问题的答案。

我建议您再问一个问题,重点关注您要绘制的数据。

【讨论】:

  • 这是我想要结束的一步;)。对不起,我真的不擅长提问。我想计算每个新客户和每个现有客户。
  • 这意味着每当新客户获得第二个条目时,它将成为现有客户。这意味着客户减1,现有客户加1
  • @S.terKeurs 。 . .您正在查看整个表。对于整张桌子,每个客户在某些时候都是新客户。也许第二列应该是count(*) - count(distinct address),但这似乎有细微差别。
【解决方案3】:

我想几个子查询会给你答案。 GROUP BY address 两者都适用,但只查看新客户出现 1 次的计数和现有客户出现超过 1 次的第二个字段。

    SELECT 
    COUNT((SELECT 
            COUNT(address)
        FROM
            my_table
        GROUP BY address
        HAVING COUNT(address) = 1)) AS `newCustomers`,
    COUNT((SELECT 
            COUNT(address)
        FROM
            my_table
        GROUP BY address
        HAVING COUNT(address) > 1)) AS `existingCustomers`
FROM
    my_table;

【讨论】:

  • 这正是我想要的。从理论上讲,这是可行的,但它表示它返回的行数超过 1 行。这是为什么呢?
  • 如果您仔细查看查询,您会发现它应该返回 2 列。每列都是一个子查询。第一个是newCustomers,第二列是existingQuery
  • 我明白了,但是为什么它会给我一个错误呢?
  • 我错过了查询的一个重要部分。查询的按地址分组部分将导致返回所有地址的列表。通过添加组地址的计数,您应该得到实际结果注意:我已将子查询包装在计数函数 @S.terKeurs
  • 很奇怪,它只是将每个条目作为现有客户返回
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 2020-04-13
  • 1970-01-01
相关资源
最近更新 更多