Access DB Query 通过对子字符串进行分组并选择最大值来过滤列数据

Posted

技术标签:

【中文标题】Access DB Query 通过对子字符串进行分组并选择最大值来过滤列数据【英文标题】:Access DB Query to filter column data by grouping the substring and choosing the maximum 【发布时间】:2012-10-12 15:20:35 【问题描述】:

数据库表'LabelInfo'

ID      Labels    
1       TRPKLM003 
2       JPRECM001 
3       MNTORM005 
4       JPRECM004 
5       MNTORM002 
6       JPRECM003 
7       TRPKLM002 
8       TRPKLM004 

列标签的长度是固定的。我想返回以下数据作为结果:

TRPKLM004
MNTORM005
JPRECM004

我会编写一个访问查询,它可以通过对匹配的前 6 个字符和其余 3 个字符的最大值进行分组来仅返回行。或者如果我要返回表中的所有行,我想要一种优化的方式来过滤 C# 中的结果

【问题讨论】:

我觉得你的问题有点含糊。 到目前为止,我正在按 desc 检索所有行的顺序。这只是以排序方式给我数据。然后在我的代码中,我通过在每一行上运行一个 for 循环来过滤数据,比较 substring(label, 0, 6) of label 和 rest of items 。因为如果找不到相同的标签,则它已经排序,然后返回该项目。但这是将每一行与所有行进行比较,并花费太多时间来返回结果 【参考方案1】:

db 引擎可以拆分出Labels 字段的两个组件。

SELECT
    Left(Labels, 6) AS prefix_string
    Val(Right(Labels, 3)) AS suffix_nmbr
FROM LabelInfo;

将其用作GROUP BY 查询的子查询。

SELECT
    sub.prefix_string,
    Max(sub.suffix_nmbr) AS MaxOfSuffix_nmbr
FROM
    (
        SELECT
            Left(Labels, 6) AS prefix_string
            Val(Right(Labels, 3)) AS suffix_nmbr
        FROM LabelInfo
    ) AS sub
GROUP BY sub.prefix_string;

如果在您的 c# 客户端代码中重新组合这两个部分不方便,您可以让 db 引擎将所有内容作为子查询来完成。

SELECT
    sub2.prefix_string
        & Format(sub2.MaxOfSuffix_nmbr, '000')
        AS labels_alias
FROM
    (
        SELECT
            sub1.prefix_string,
            Max(sub1.suffix_nmbr) AS MaxOfSuffix_nmbr
        FROM
            (
                SELECT
                    Left(Labels, 6) AS prefix_string
                    Val(Right(Labels, 3)) AS suffix_nmbr
                FROM LabelInfo
            ) AS sub1
        GROUP BY sub1.prefix_string
    ) AS sub2; 

【讨论】:

感谢您的询问..你太棒了!!唯一的问题是我的前缀被截断...... 007 返回为 7 和 003 作为 3 .. 我可以将它作为完整的 3 个字符.. 因为我需要整个字符串作为结果 那是因为我将字符串部分转换为数字。您可以将其转换回“000”格式的字符串并将其与“prefix_string”片段连接起来。看看最后一个(未经测试的)查询版本是否返回你想要的。 是的.. 明白了!!谢谢..我努力了好几个小时才能让它完全正常工作.. !!你节省了很多时间!

以上是关于Access DB Query 通过对子字符串进行分组并选择最大值来过滤列数据的主要内容,如果未能解决你的问题,请参考以下文章

DB Query Analyzer 6.03, the most excellent Universal DB Access tools on any Microsoft Windows OS(示例代

Access VBA - 数据库打开一段时间后对子表单的引用消失

如何从Android中的数据库中获取数据?通过光标 c= db.query?

JET OLEDB 参数如何将字符串与 Access DB 中的文本字段进行比较

停止 .NET 应用程序的 SQL Server DB 可以通过使用 ODBC 的 Access 进行修改?

针对 Access 2010 DB 的 SQL 语句不适用于 ODBC