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 中的文本字段进行比较