当标识字段位于两个单独的列中时,如何检索该特定记录的最新出现? [关闭]

Posted

技术标签:

【中文标题】当标识字段位于两个单独的列中时,如何检索该特定记录的最新出现? [关闭]【英文标题】:how can one go about retrieving the latest occurrence of that specific record When the identifying fields are in two separate columns? [closed] 【发布时间】:2020-07-29 20:01:12 【问题描述】:

Example Data Table

如您所见,我在数据表中有两行,我需要获取文档的最新出现。如果发出请求,则文档由 GUID 标识,并且对该文档的所有其他修改/取消在我的数据表中创建为新记录,但不是携带 GUID,而是使用原始请求标识符(原始 GUID的第一个请求)我只想返回最新的事件,所以如果不存在修改/取消,那么我只想返回原始请求,否则如果有修改或取消,那么我需要在我的数据表中返回该记录。在这一点上,我尝试了内部连接,但收到的结果太多,无法理解我出错的地方我曾考虑在两个临时表之间使用某种合并,但此时我没有想法。在简短的总结中,一旦我结合了我的 GUID 和原始请求标识符列,我需要通过在唯一数据集上使用处理日期来获取最新记录。有什么建议吗?

SQL Example

【问题讨论】:

请向我们展示代码、预期、实际结果以及两者之间的差异。此外,将您的问题描述分成单独的段落也没有什么坏处。 听起来您的数据库设计存在根本缺陷,需要修改。如果一个表必须引用自己,听起来 something 应该在不久前被移出到一个单独的表中。现在你有GUIDOriginalGUID 作为主键,这是完全错误的。我听说过复合主键,但从未听说过交替主键。 @Christopher 这是由 Web 服务返回的数据表,实际 DB 有一个 ID 字段作为主键。 GUID 和 OrginalGUID 只是数据库中的普通用户字段,我现在正在尝试进一步查询 @LajosArpad 在这一点上我没有任何代码,因为在我在代码中执行相同操作之前,我一直在尝试在 SQL 中解决它。我的预期结果是,如果我只有一个请求,即只有一个请求填充了 GUID,并且每个进程都必须以请求开头,那么我应该返回该请求。如果对文件进行了修改或取消,那么我必须返回最新的修改/取消请求。基于 GUID 和 Original Request Identifier 作为原始 Request Identifier 的两个匹配将始终具有 Original Request 的 GUID。 你的 SQL 代码很有趣。那也是代码。我无法改进我没有看到为我不知道的模式编写的代码。您需要提供更多信息,以便我们为您提供帮助。 【参考方案1】:

在我看来,您似乎想多了:您想将具有相同 GUIDOriginal Request Identifier 的行组合在一起,而不是将具有最新 Processing Date 的行组合在一起。您几乎可以直接执行此操作:

var ans = dt.AsEnumerable()
            .GroupBy(r => String.IsNullOrEmpty(r.Field<string>("GUID")) ? r.Field<string>("Original Request Identifier") : r.Field<string>("GUID"))
            .Select(rg => rg.OrderBy(r => r.Field<DateTime>("Processing Date")).Last())
            .CopyToDataTable();

由于您没有指定,我使用string 作为 GUID 行类型,并假设原始表名为 dt

我喜欢为null 或空字符串使用类似于?? 的扩展方法:

public static string NotEmptyOr(this string src, string other) => String.IsNullOrEmpty(src) ? other : src;

那你就不用重复GUID字段引用了:

var ans = dt.AsEnumerable()
            .GroupBy(r => r.Field<string>("GUID").NotEmptyOr(r.Field<string>("Original Request Identifier")))
            .Select(rg => rg.OrderBy(r => r.Field<DateTime>("Processing Date")).Last())
            .CopyToDataTable();

【讨论】:

【参考方案2】:

尝试以下加入:

            var query = (from dr1 in dt.AsEnumerable()
                         join dr2 in dt.AsEnumerable() on dr1.Field<string>("GUID") equals dr2.Field<string>("Origina Request Identifer")
                         select new  dr1 = dr1, dr2 = dr2 
                         )
                         .Select(x => (x.dr1.Field<DateTime>("Processing Date") > x.dr1.Field<DateTime>("Processing Date")) ? x.dr1 : x.dr2)
                         .ToList();

【讨论】:

它没有工作它因为指定的演员阵容无效而失败。 那么需要更改尖括号中的类型以匹配表格中的类型。 var query = (from dr1 in dt.AsEnumerable() join dr2 in dt.AsEnumerable() on dr1.Field(MandateRequestFile.GUID) 等于 dr2.Field(MandateAmendmentFile. OriginalRequestIdentifier) 选择新 dr1 = dr1, dr2 = dr2 ) .Select(x => (DateTime.Compare(Convert.ToDateTime(x.dr1.Field(TableDefinitionDescriptions.ProcessingDate)),Convert.ToDateTime(x. dr1.Field(TableDefinitionDescriptions.ProcessingDate))) > 1 ? x.dr1 : x.dr2)) .CopyToDataTable(); 这几乎奏效了,除了我提到它只返回有修改/取消的请求,但不只返回请求,即只有一个 GUID 的记录,没有相应的修改/取消记录 你可以返回任何你想要的东西而不是 : ? x.dr1 : x.dr2 你可以用吗?新 n = x.dr1, o = x.dr2 : 新 n = x.dr2, o = x.dr1

以上是关于当标识字段位于两个单独的列中时,如何检索该特定记录的最新出现? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 在单独的列中跟踪重复记录类型

页面位于 iFrame 中时未保存会话变量

如何将位字段的真/假计数分为两个单独的列

当文本字段位于 uitableviewcell 中时,不调用 touchesBegan

当前端和后端位于虚拟 Docker 网络中时,如何使用 axios 寻址后端主机

PHPmyadmin 3.4.9 导出到 CSV 的问题