计算包含字母/数字的行数

2024-05-15

我想要实现的目标很简单,但是解释起来有点困难,我不知道在 postgres 中这是否真的可能。我处于相当基础的水平。SELECT, FROM, WHERE, LEFT JOIN ON, HAVING,等等基本的东西。

我正在尝试计算包含特定字母/数字的行数,并显示该字母/数字的计数。

即有多少行包含包含“a/A”的条目(不区分大小写)

我正在查询的表是电影名称列表。我想做的就是对“a-z”和“0-9”进行分组和计数并输出总数。我可以按顺序运行 36 个查询:

SELECT filmname FROM films WHERE filmname ilike '%a%'
SELECT filmname FROM films WHERE filmname ilike '%b%'
SELECT filmname FROM films WHERE filmname ilike '%c%'

然后对结果运行 pg_num_rows 以查找我需要的数字,依此类推。

我知道喜欢有多强烈,而且喜欢得更多,所以我宁愿避免这种情况。虽然数据(如下)的数据有大小写,但我希望结果集不区分大小写。即“盯着山羊的男人”,a/A、t/T 和 s/S 不会对结果集计数两次。我可以将该表复制到辅助工作表,其中数据全部为 strtolower,并处理该查询的数据集(如果它使查询更简单或更容易构建)。

另一种选择可能是这样的

SELECT sum(length(regexp_replace(filmname, '[^X|^x]', '', 'g'))) FROM films;

对于每个字母组合,但同样是 36 个查询、36 个数据集,我更希望能够在单个查询中获取数据。

这是我的数据集中的 14 部电影的简短数据集(实际上包含 275 行)

District 9
Surrogates
The Invention Of Lying
Pandorum
UP
The Soloist
Cloudy With A Chance Of Meatballs
The Imaginarium of Doctor Parnassus
Cirque du Freak: The Vampires Assistant
Zombieland
9
The Men Who Stare At Goats
A Christmas Carol
Paranormal Activity

如果我手动将每个字母和数字放在一列中,然后通过在该列中给它一个 x 来注册该字母是否出现在电影标题中,然后将它们计数以产生总数,我将得到如下所示的内容。 x 的每个垂直列都是该电影名称中字母的列表,无论该字母出现多少次或其大小写。

上面短集的结果是:

A  x x  xxxx xxx  9 
B       x  x      2 
C x     xxx   xx  6
D x  x  xxxx      6
E  xx  xxxxx x    8
F   x   xxx       4 
G  xx    x   x    4
H   x  xxxx  xx   7
I x x  xxxxx  xx  9
J                 0
K         x       0
L   x  xx  x  xx  6
M    x  xxxx xxx  8
N   xx  xxxx x x  8
O  xxx xxx x xxx  10
P    xx  xx    x  5
Q         x       1
R xx x   xx  xxx  7
S xx   xxxx  xx   8
T xxx  xxxx  xxx  10
U  x xx xxx       6
V   x     x    x  3
W       x    x    2
X                 0 
Y   x   x      x  3
Z          x      1 
0                 0  
1                 0  
2                 0 
3                 0
4                 0
5                 0
6                 0
7                 0
8                 0
9 x         x     1

在上面的示例中,每一列都是一个“电影名称”,如您所见,第 5 列仅标记“u”和“p”,第 11 列仅标记“9”。最后一列是每个字母的计数。

我想以某种方式构建一个查询,给出结果行:A 9、B 2、C 6、D 6、E 8 等,同时考虑到从我的电影列中提取的每个行条目。如果该字母没有出现在任何行中,我想要一个零。

我不知道这是否可能,也不知道在 php 中系统地执行 36 个查询是否是唯一的可能性。

当前数据集中有 275 个条目,每月增长约 8.33 个(每年 100 个)。我预计到 2019 年它将达到大约 1000 行,届时我无疑将使用完全不同的系统,因此我不需要担心使用庞大的数据集来进行搜索。

目前最长的标题是“波西·杰克逊与奥林匹亚众神:神火之盗”,有 50 个字符(是的,我知道这部电影很糟糕;-),最短的是 1,“9”。

我正在运行 Postgres 9.0.0 版本。

抱歉,如果我以多种方式多次说过同一件事,我会尽力获取尽可能多的信息,以便您知道我想要实现的目标。

如果您需要任何说明或更大的数据集进行测试,请询问,我将根据需要进行编辑。

非常欢迎提出建议。

Edit 1

Erwin感谢您的编辑/标签/建议。同意他们所有人的观点。

按照建议修复了丢失的“9”拼写错误Erwin。我的手动转录错误。

kgrittn,感谢您的建议,但我无法从 9.0.0 更新版本。我已询问我的提供商是否会尝试更新。

Response

感谢您的精彩回复Erwin

对于回复延迟深表歉意,但我一直在努力让您的查询发挥作用,并学习新的关键字来理解您创建的查询。

我调整了查询​​以适应我的表结构,但结果集不符合预期(全为零),因此我直接复制了您的行并得到了相同的结果。

虽然两种情况下的结果集都列出了所有 36 行以及相应的字母/数字,但所有行的计数 (ct) 均显示为零。

我尝试解构查询以查看它可能在哪里失败。

的结果

SELECT DISTINCT id, unnest(string_to_array(lower(film), NULL)) AS letter
FROM  films


是“未找到行”。也许当从更广泛的查询中提取时应该如此,我不确定。

当我删除 unnest 函数时,结果是 14 行全部带有“NULL”

如果我调整功能

COALESCE(y.ct, 0) to COALESCE(y.ct, 4)<br />

然后我的数据集对每个字母都用 4 进行响应,而不是像前面所解释的那样为零。

简要阅读了 COALESCE 上的“4”作为替代值后,我猜测 y.ct 为 NULL 并被第二个值替代(这是为了覆盖序列中字母不匹配的行,即如果没有电影包含“q”,那么“q”列将具有零值而不是 NULL?)

我尝试使用的数据库是 SQL_ASCII,我想知道这是否是一个问题,但我在使用 UTF-8 运行 8.4.0 版本时得到了相同的结果。

如果我犯了一个明显的错误,但我无法返回我需要的数据集,我深表歉意。

有什么想法吗?

再次感谢您的详细回复和解释。


这个查询应该完成这个工作:

测试用例:

CREATE TEMP TABLE films (id serial, film text);
INSERT INTO films (film) VALUES
 ('District 9')
,('Surrogates')
,('The Invention Of Lying')
,('Pandorum')
,('UP')
,('The Soloist')
,('Cloudy With A Chance Of Meatballs')
,('The Imaginarium of Doctor Parnassus')
,('Cirque du Freak: The Vampires Assistant')
,('Zombieland')
,('9')
,('The Men Who Stare At Goats')
,('A Christmas Carol')
,('Paranormal Activity');

Query:

SELECT l.letter, COALESCE(y.ct, 0) AS ct
FROM  (
    SELECT chr(generate_series(97, 122)) AS letter  -- a-z in UTF8!
    UNION ALL
    SELECT generate_series(0, 9)::text              -- 0-9
    ) l
LEFT JOIN (
    SELECT letter, count(id) AS ct
    FROM  (
        SELECT DISTINCT  -- count film once per letter
               id, unnest(string_to_array(lower(film), NULL)) AS letter
        FROM   films
        ) x
    GROUP  BY 1
    ) y  USING (letter)
ORDER  BY 1;
  • 这需要 PostgreSQL9.1!考虑发行说明 http://www.postgresql.org/docs/current/interactive/release-9-1.html:

更改 string_to_array() 以便 NULL 分隔符将字符串拆分为 角色(帕维尔·斯特胡勒)

以前这会返回空值。

  • 您可以使用regexp_split_to_table(lower(film), '') http://www.postgresql.org/docs/current/interactive/functions-string.html#FUNCTIONS-STRING-OTHER, 代替unnest(string_to_array(lower(film), NULL)) http://www.postgresql.org/docs/current/interactive/functions-array.html#ARRAY-FUNCTIONS-TABLE(适用于 9.1 之前的版本!),但它通常会慢一些,并且对于长字符串,性能会下降。

  • I use generate_series()生产[a-z0-9]作为单独的行。并对查询进行 LEFT JOIN,因此每个字母都会在结果中表示。

  • Use DISTINCT每部电影都数一次。

  • 永远不用担心 1000 行。这对于现代硬件上的现代 PostgreSQL 来说简直就是小菜一碟。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算包含字母/数字的行数 的相关文章

  • 方法“Boolean Contains(System.String)”不支持对 SQL 的转换

    方法 Boolean Contains System String 不支持对 SQL 的转换 查询是 IsQueryable 但这停止工作 foreach string s in collection1 if s Length gt 0 q
  • 对 SQL 时间序列进行采样

    我有一个日期时间的时间序列 存储在 mySQL 中的双列 并且希望每分钟对时间序列进行采样 即以一分钟的间隔提取最后一个值 有没有一种有效的方法可以在一个 select 语句中执行此操作 蛮力方法将涉及选择整个系列并在客户端进行采样或为每个
  • 如何获取 JDBC 中 UPDATE 查询影响的所有行?

    我有一项任务需要使用更新记录PreparedStatement 一旦记录被更新 我们知道更新查询返回计数 即受影响的行数 但是 我想要的不是计数 而是受更新查询影响的行作为响应 或者至少是受影响的行的 id 值列表 这是我的更新查询 UPD
  • 随机排列每行的列值

    我正在使用 C NET 开发多项选择题考试生成器 每次做出报告时 都会在数据库中随机挑选问题 并随机调整选项 我可以做随机问题部分 但我不能做选择的洗牌 我有一张表 其中一行如下 question answer distractor1 di
  • 使用 PostgreSQL 的模式和 Rails 创建多租户应用程序

    我已经想通的事情 我正在学习如何在 Rails 中创建多租户应用程序 该应用程序根据用于查看应用程序的域或子域来提供来自不同模式的数据 我已经回答了一些问题 如何让 subdomain fu 也能与域一起使用 这是有人问了同样的问题 htt
  • TSQL:无法对 COUNT(*) 执行聚合函数 AVG 来查找一天中最繁忙的时间

    考虑一个保存日志数据的 SQL Server 表 重要的部分是 CREATE TABLE dbo CustomerLog ID int IDENTITY 1 1 NOT NULL CustID int NOT NULL VisitDate
  • 更新期间唯一索引违规

    我在更大的数据库中遇到了唯一索引违规 最初的问题发生在存储的 pl pgsql 函数中 我已经简化了一切以显示我的问题 我可以在一个相当简单的表格中重现它 CREATE TABLE public test id integer NOT NU
  • PostgreSQL & regexp_split_to_array + 取消嵌套

    我有这样的绳子 测试1 纽约 X 测试 2 芝加哥 Y 测试 3 宾夕法尼亚州哈里斯堡 Z 我需要的结果是 Column1 Column 2 Column3 Test 1 new york X Test 2 chicago Y Test 3
  • 如何在oracle中获取表作为输出参数

    我正在尝试将 Oracle 过程调用的 out 参数强制转换为对象 它不起作用 因为 据我了解 我需要定义一个映射 它告诉方法如何转换它 如果地图为空或未正确填充 则它默认为 STRUCT 类型的对象 在我的情况下这是错误的 我已经构建了一
  • 删除前导零

    给定列中的数据 如下所示 00001 00 00026 00 我需要使用 SQL 删除空格后面的所有内容以及值中的所有前导零 以便最终输出为 1 26 我怎样才能最好地做到这一点 顺便说一句 我正在使用 DB2 这已在 DB2 for Li
  • C# 查询两个数据库的数据

    我目前有一个查询 我正在从两个不同的数据库获取数据 这些数据被附加到一个名为 accountbuys 的列表中 我的第一个表有三个数据条目 3个想要购买股票的帐户 下一张表有 17 个数据点 购买 17 只股票 I am merging t
  • SQL查询获取最后两条记录的DateDiff

    我有一个名为 Event 的表 其中 eventNum 作为主键 日期作为 SQL Server 2008 R2 中的 datetime2 7 我试图获取表中最后两行的日期并以分钟为单位获取差异 这就是我目前所拥有的 Select DATE
  • 过滤项目来源

    通过此代码 我设置了数据网格的 ItemsSource 不过 我有更多的 wpf 控件来过滤数据网格 例如从时间范围过滤数据网格 我可以为此编写一个新查询 但这似乎没有必要 因为数据已经可用 我只需要过滤它 最好的方法是什么 我能得到的任何
  • Python在postgresql表中查找带有单引号符号的字符串

    我需要从 psql 表中查找包含多个单引号的字符串 我当前的解决方案是将单引号替换为双单引号 如下所示 sql query f SELECT exists SELECT 1 FROM table name WHERE my column m
  • Rails 4 - 如何在开发中使用 sqlite3 以及在生产中使用 PostgreSQL 和 Heroku

    我正在尝试部署到 Heroku 但不能 因为默认的 sqlite3 服务器仍然存在 检测到 Heroku 不支持 sqlite3 gem https devcenter heroku com articles sqlite3 https d
  • 在 SELECT 中将列值拆分为两列?

    我在 varchar 列中有一个字符串值 它是一个由两部分组成的字符串 在它到达数据库之前分割它不是一个选择 该列的值如下所示 one column part1 part2 part1 part2 所以我想要的是一个如下所示的结果集 col
  • 如何将此本机 SQL 查询转换为 HQL

    所以我有这个很长的复杂的 Native SQLQuery string hql SELECT FROM SELECT a rownum r FROM select f2 filmid f2 realisateurid f2 titre f2
  • 从复选框列表中选择循环生成的复选框中的一个复选框

    抱歉我的英语不好 在我的 ASP NET 网站上 我从 SQL 表导入软件列表 看起来像这样 但实际上要长得多 Microsoft Application Error Reporting br br Microsoft Applicatio
  • 如何计算关联实体而不在实体框架中获取它们

    我想知道这个问题已经有一段时间了 所以我认为值得使用我的第一篇 Stack Overflow 帖子来询问它 想象一下我正在与关联的消息列表进行讨论 DiscussionCategory discussionCategory reposito
  • 将 CSV 复制到 Amazon RDS 托管的 Postgresql 数据库

    我有一个使用 Amazon 的 RDS 服务托管的数据库 我正在尝试编写一个 Web 服务来更新所述数据库 我遇到的问题是它不允许我使用 COPY 命令 因为我收到此错误 错误 必须是超级用户才能复制到文件或从文件复制 我正在使用我为数据库

随机推荐

  • Python 中的字符串slugification

    我正在寻找 slugify 字符串的最佳方法 蛞蝓 是什么 https stackoverflow com questions 427102 in django what is a slug 我当前的解决方案基于这个食谱 http code
  • bash:gitolite:找不到命令

    我正在尝试使用 Gitolite 在 Gitlab 中创建一个新分支 我完成安装步骤 当我遇到 设置 gitolite 部分时 我遇到了麻烦 我跟着这个link http sitaramc github com gitolite setup
  • 如何在 kubernetes 中将秘密标记为可选?

    来自文档 除非将秘密标记为可选 否则必须先创建秘密 然后再将其作为环境变量在 pod 中使用 引用不存在的 Secret 将阻止 pod 启动 如何将秘密标记为可选 您正在寻找的是 name ENV NAME valueFrom secre
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft
  • xsi:type 属性搞乱了 C# XML 反序列化

    我使用 XSD exe 根据 XML 架构 xsd 文件 自动生成 C 对象 我正在反序列化 OpenCover 输出 但其中一个部分类未正确生成 这是导致异常的行
  • 一些基本的 PHP 问题 [已关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我只是有一些基本的 php 问题来加深我对学习的理解 但我找不到简单的答案 我有一个 php ajax 应用程序 它生成 mysql
  • If else 在 Web 网格列中

    如何在 webgrid 列中添加条件 if else grid GetHtml tableStyle table table bordered columns grid Columns grid Column RealName Name g
  • View.post(),以及当Runnables被执行时

    我最初的问题是需要知道我的根的高度和宽度View这样我就可以进行程序化的布局更改 就我的目的而言 我不一定需要在onCreate 对于我来说 以编程方式添加我的孩子就足够了View根布局完成后 因此我很乐意使用onWindowFocusCh
  • Azure Functions 计时器触发器线程安全

    我想知道是否有人知道如果您在 Azure 函数上设置了 Cron 设置 如果其任务执行时间超过 5 分钟 则每 5 分钟运行一次 会发生什么情况 它备份吗 或者我应该实现一个锁定功能 以防止某些东西 例如在循环中 处理先前调用已经处理的数据
  • SimpleIoC - 在缓存中找不到类型:Windows.UI.Xaml.Controls.Frame

    第一次由 SimpleIoC 实例化我的 ViewModel 时 我遇到了以下错误 我相信我已经按应有的方式设置了容器 但由于某种原因 我仍然收到以下错误 任何想法或帮助将非常感激 Microsoft Practices ServiceLo
  • 将 Angular Web 组件 EventEmitter 监听到 javascript

    我在以下工具的帮助下创建了一个小型网络组件本文 https medium com IMM9O web components with angular d0205c9db08f使用角度元素 其中包括 Input and Output 我能够将
  • svn 强制迁移

    我正在考虑将我们的 svn 代码库迁移到 perforce 看看谷歌搜索结果 我确实找到了两个具有相同功能的工具 P4转换ftp ftp perforce com pub perforce tools p4convert docs inde
  • java'assert'和'if(){}else exit;'之间的区别

    java和java有什么区别assert and if else exit 我可以用吗if else exit代替assert 也许有点谷歌 您应该记住的主要事情是 if else 语句应该用于程序流程控制 而assert 关键字应该仅用于
  • R闪亮:使用闪亮的JS从数据表中获取信息

    我想读出所有列名称以及它们在数据表中显示的顺序 由于不同的原因 我无法使用 stateSave 等选项 我对 JS 没有什么把握 但我确信用它可以完成 所以我需要你帮助我 我尝试过类似的代码片段 datatable data callbac
  • React 错误:目标容器不是 DOM 元素

    我刚刚开始使用 React 所以这可能是一个非常简单的错误 但我们开始吧 我的html代码非常简单 load staticfiles
  • 从 JavaScript 中的 OnClientClick 事件中阻止 C# 中的 asp:Button OnClick 事件?

    我有一个asp Button在我的网页上 它调用 JavaScript 函数和代码隐藏方法 后者进行调用以导航到另一个页面 在 JavaScript 函数中 我正在检查条件 如果不满足这个条件 我想中止导航 以便OnClick方法未被调用
  • PLS-00103:遇到符号“;”当预期出现以下情况之一时:

    我正在尝试插入用户安全问题的答案 以用于密码重置功能 Ellucian 横幅 v8 提供了一个用于运行此 API 的 API 我对他们的 API 非常陌生 从下面的错误消息来看 我还远远没有正确运行它 任何帮助表示赞赏 我尝试在 Oracl
  • 自定义字符串查询操作的 Linq to NHibernate 可扩展性?

    我希望能够在 NHibernate Linq 表达式中使用自定义字符串查询 举例来说 这只是一个例子 我希望能够选择包含属性的实体 该属性是特定字符串的字谜 var myEntities EntityRepository AllEntiti
  • Keystore getEntry 在 Android 9 上返回 NULL

    c我已对存储在 Android 密钥库中的登录密码进行了加密和解密 在 Android 9 上 我观察到应用程序在尝试解密密码时崩溃 我无法重现它 但拥有 Pixel 3 的用户是崩溃的设备之一 下面是我如何从密钥库解密密码 private
  • 计算包含字母/数字的行数

    我想要实现的目标很简单 但是解释起来有点困难 我不知道在 postgres 中这是否真的可能 我处于相当基础的水平 SELECT FROM WHERE LEFT JOIN ON HAVING 等等基本的东西 我正在尝试计算包含特定字母 数字