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
我想通过监控特定字段的不同值以及每个不同值出现的次数来分析 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