SQL - 计算每个不同的行

SQL - count each distincted row

我想通过监控特定字段的不同值以及每个不同值出现的次数来分析 table 的内容。

假设我们有这个 table ...

Field
000
000
000
111
111
222
333

所以结果将是:

Field Count
000    3
111    2
222    1
333    1

要实现这个结果,查询会是什么?

简单地说:

SELECT field, count(*) as count
FROM table
GROUP BY field

对此没什么可说的,这可能是所有聚合查询中最简单的一个。

但是,如果您正在监控,您可能需要跟踪以前有多少东西,现在有多少东西。我为此使用 SQL SERVER 语法,但该技术相当普遍适用:

如果您创建历史 table 并设置了日期、字段和计数列,那么 运行 每分钟(比如):

  INSERT INTO history

  SELECT iter.iteration, t.field, t.count(*) as count
  FROM table t
  CROSS JOIN
  (SELECT GetUtcDate() as iteration) iter 
  GROUP BY field

然后您将每分钟插入一堆行,其中包含不断变化的计数和保存该数据的递增日期。您需要做的就是比较事情的变化:

SELECT *
FROM 
  history o 
  FULL OUTER JOIN 
  history n
  ON 
    o.field = n.field AND 
    o.count <> n.count AND
    o.iteration = '2001-01-01 00:00:00' AND
    n.iteration = '2001-01-01 00:01:00'

我们使用完全外部连接,以便字段可以在迭代之间完全来来去去(所有类型的删除,添加新的等)。我们过滤以仅显示已更改的计数。此查询还演示了如何将 table 连接到自身,这是一个很方便的技巧

SELECT Field, COUNT(*) AS Count
FROM table
GROUP BY Field
ORDER BY Count