当标识字段位于两个单独的列中时,如何检索该特定记录的最新出现? [关闭]
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 应该在不久前被移出到一个单独的表中。现在你有GUID
或OriginalGUID
作为主键,这是完全错误的。我听说过复合主键,但从未听说过交替主键。
@Christopher 这是由 Web 服务返回的数据表,实际 DB 有一个 ID 字段作为主键。 GUID 和 OrginalGUID 只是数据库中的普通用户字段,我现在正在尝试进一步查询
@LajosArpad 在这一点上我没有任何代码,因为在我在代码中执行相同操作之前,我一直在尝试在 SQL 中解决它。我的预期结果是,如果我只有一个请求,即只有一个请求填充了 GUID,并且每个进程都必须以请求开头,那么我应该返回该请求。如果对文件进行了修改或取消,那么我必须返回最新的修改/取消请求。基于 GUID 和 Original Request Identifier 作为原始 Request Identifier 的两个匹配将始终具有 Original Request 的 GUID。
你的 SQL 代码很有趣。那也是代码。我无法改进我没有看到为我不知道的模式编写的代码。您需要提供更多信息,以便我们为您提供帮助。
【参考方案1】:
在我看来,您似乎想多了:您想将具有相同 GUID
或 Original 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以上是关于当标识字段位于两个单独的列中时,如何检索该特定记录的最新出现? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
当文本字段位于 uitableviewcell 中时,不调用 touchesBegan