编辑Postgres 9.3
我正在处理具有以下架构的报告:http : //sqlfiddle.com/#!15/fd104/2
当前查询工作正常,如下所示:
基本上它是一个 3 表内连接。我没有做这个查询,而是离开它的开发人员,我想修改查询。如您所见,TotalApplication只计算基于a.agent_id. 您可以totalapplication在结果中看到该列。我想要的是删除它并将其更改totalapplication为新的两列。我想添加一个completedsurvey和partitalsurvey列。所以基本上这部分会变成
SELECT a.agent_id as agent_id, COUNT(a.id) as CompletedSurvey
FROM forms a WHERE a.created_at >= '2015-08-01' AND
a.created_at <= '2015-08-31' AND disposition = 'Completed Survey'
GROUP BY a.agent_id
Run Code Online (Sandbox Code Playgroud)
我刚刚添加AND disposition = 'Completed Survey'但我需要另一列partialsurvey具有相同的查询,completedsurvey唯一的区别是
AND disposition = 'Partial Survey'
Run Code Online (Sandbox Code Playgroud)
和
COUNT(a.id) as PartialSurvey
Run Code Online (Sandbox Code Playgroud)
但我不知道该把查询放在哪里,也不知道查询会是什么样子。所以最终输出有这些列
agent_id, name, completedsurvey, partialsurvey, loginhours, applicationperhour, rph
Run Code Online (Sandbox Code Playgroud)
一旦确定,然后 applicationperhour …
我似乎记得(在 Oracle 上) utteringselect count(*) from any_table和select count(any_non_null_column) from any_table.
如果有的话,这两个陈述之间有什么区别?
SELECT
student.StudentID,
student.`Name`,
COUNT(attendance.AttendanceID) AS Total
FROM
student
LEFT JOIN attendance ON student.StudentID = attendance.StudentID
Run Code Online (Sandbox Code Playgroud)
我正在尝试计算最后一行,但它计算所有结果并返回一个结果
我得到了类似的东西

因为有多个记录,因为 K1052280 的出勤 ID 中有两个条目,所以我想计算这些条目并返回数字。就像是

我正在运行 PostgresSQL 9.2 并且有一个 12 列的关系,大约有 6,700,000 行。它包含 3D 空间中的节点,每个节点都引用一个用户(创建它的人)。要查询哪个用户创建了多少个节点,我执行以下操作(添加explain analyze以获取更多信息):
EXPLAIN ANALYZE SELECT user_id, count(user_id) FROM treenode WHERE project_id=1 GROUP BY user_id;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------
HashAggregate (cost=253668.70..253669.07 rows=37 width=8) (actual time=1747.620..1747.623 rows=38 loops=1)
-> Seq Scan on treenode (cost=0.00..220278.79 rows=6677983 width=8) (actual time=0.019..886.803 rows=6677983 loops=1)
Filter: (project_id = 1)
Total runtime: 1747.653 ms
Run Code Online (Sandbox Code Playgroud)
如您所见,这大约需要 1.7 秒。考虑到数据量,这还算不错,但我想知道这是否可以改进。我尝试在用户列上添加 BTree 索引,但这没有任何帮助。
您有其他建议吗?
为了完整起见,这是完整的表定义及其所有索引(没有外键约束、引用和触发器):
Column | Type | Modifiers
---------------+--------------------------+------------------------------------------------------
id | bigint | not null default nextval('concept_id_seq'::regclass)
user_id | bigint …Run Code Online (Sandbox Code Playgroud) 我想要一种快速的方法来计算我的表中有几百万行的行数。我在 Stack Overflow 上找到了帖子“ MySQL:计算行数的最快方法”,看起来它可以解决我的问题。Bayuah提供了这个答案:
SELECT
table_rows "Rows Count"
FROM
information_schema.tables
WHERE
table_name="Table_Name"
AND
table_schema="Database_Name";
Run Code Online (Sandbox Code Playgroud)
我喜欢它,因为它看起来像查找而不是扫描,所以它应该很快,但我决定对其进行测试
SELECT COUNT(*) FROM table
Run Code Online (Sandbox Code Playgroud)
看看有多大的性能差异。
不幸的是,我得到了不同的答案,如下所示:
为什么答案相差大约 200 万行?我猜执行全表扫描的查询是更准确的数字,但是有没有一种方法可以获得正确的数字而不必运行这个慢查询?
我跑了ANALYZE TABLE data_302,它在 0.05 秒内完成。当我再次运行查询时,我现在得到了 34384599 行的更接近的结果,但它仍然select count(*)与 34906061 行的数字不同。分析表是否立即返回并在后台处理?我觉得值得一提的是,这是一个测试数据库,目前尚未写入。
没有人会关心是否只是告诉某人表有多大,但我想将行数传递给一些代码,这些代码将使用该数字创建一个“同等大小”的异步查询来查询数据库并行,类似于Alexander Rubin 通过并行查询执行提高慢查询性能中显示的方法。事实上,我将获得最高的 id,SELECT id from table_name order by id DESC limit 1并希望我的表不会变得过于分散。
我正在编写一个脚本来获取几个表的行数,但是对于某些表,我只想获取设置了标志的行数(在这种情况下为 active=1)。有没有一种方法可以在一个查询中做到这一点?
例如:
表users有一个名为 active 的列
表clients没有名为 active 的列
我想获取 active=1 的用户数,并获取客户端数。
在你说“只是硬编码它”之前,这是一个在 python 脚本中的查询,该脚本可以在许多不同的数据库上运行,我无法知道我的脚本将选择哪些表,以及它们是否有一个名为 的列active,以及我宁愿只用一个查询来完成所有工作,而不是两个单独的查询并依靠 mysql 抛出错误,所以我知道使用另一个查询。
我正在尝试运行以下查询以提供patients表中具有refinst列值的行的百分比。我一直得到0的结果。
select (count (refinst) / (select count(*) from patients) * 100) as "Formula"
from patients;
Run Code Online (Sandbox Code Playgroud)
该表有 15556 行,并select count(refinst) from patients告诉我其中 1446行在列中有值refinst。我想从查询中得到的响应是 30.62 ( 1446/15556*100=30.62XXXXX,四舍五入到两位小数)。
我很确定它与计数结果的数据类型(我假设是整数)有关。如果我将一个整数除以一个整数并且结果小于 0,它会被截断为 0 是否正确?如果是这种情况,有人可以告诉我如何将计数结果转换为带有 2 个小数位的数字,以便结果也四舍五入到 2 个小数位吗?
我确信有比多个 count 语句更好的方法来编写此代码。我正在寻找一种更高效的方式来编写这个查询。
这个查询:select count(*) from planner_event需要很长时间才能运行 - 太长了,我在它完成之前放弃并杀死了它。但是,当我运行时explain select count(*) from planner_event,我可以在输出中看到一列带有行数 (14m)。
为什么explain可以立即得到行数,而count(*)却需要很长时间才能运行?
每个人都知道,在使用 InnoDB 作为引擎的表中,诸如此类SELECT COUNT(*) FROM mytable的查询非常不准确且非常慢,尤其是当表变大并且在该查询执行时不断插入/删除行时。
据我了解,InnoDB 不会将行数存储在内部变量中,这就是导致此问题的原因。
我的问题是:为什么会这样?存储这样的信息有那么难吗?在许多情况下,这是一个重要的信息。我看到是否要实现这样的内部计数的唯一困难是当涉及事务时:如果事务未提交,您是否计算它插入的行数?
PS:我不是数据库方面的专家,我只是一个将 MySQL 作为一个简单爱好的人。因此,如果我只是问一些愚蠢的问题,请不要过分挑剔:D。
我玩了一场篮球比赛,它允许将其统计数据输出为数据库文件,因此可以从中计算出游戏中未实现的统计数据。到目前为止,我在计算我想要的统计数据时没有遇到任何问题,但现在我遇到了一个问题:从他的比赛统计数据中计算一个球员在整个赛季中取得的双打和/或三双的数量。
双双和三双的定义如下:
双双:
两双是指球员在一场比赛中在五个统计类别中的两个类别(得分、篮板、助攻、抢断和盖帽)中累积达到两位数的总和的表现。
三双:
三双被定义为球员在一场比赛中在五个统计类别中的三个——得分、篮板、助攻、抢断和盖帽——中累计达到两位数的表现。
四双(添加澄清)
四双被定义为球员在一场比赛中在五个统计类别中的四个类别(得分、篮板、助攻、抢断和盖帽)中累计达到两位数的表现。
“PlayerGameStats”表存储玩家玩的每个游戏的统计数据,如下所示:
CREATE TABLE PlayerGameStats AS SELECT * FROM ( VALUES
( 1, 1, 1, 'Nuggets', 'Cavaliers', 6, 8, 2, 2, 0 ),
( 2, 1, 2, 'Nuggets', 'Clippers', 15, 7, 0, 1, 3 ),
( 3, 1, 6, 'Nuggets', 'Trailblazers', 11, 11, 1, 2, 1 ),
( 4, 1, 10, 'Nuggets', 'Mavericks', 8, 10, 2, 2, 12 ),
( 5, 1, 11, 'Nuggets', 'Knicks', 23, 12, 1, 0, 0 ),
( …Run Code Online (Sandbox Code Playgroud)