C# 有两个datatable dt和datatable dtLH, dt里包含列recordid,orderid,sn,dtLH里包含InverterSN,PvResult,BatResult, 组合两张表要求显示不重复的列SN,PvResult,BatResult,若出现相同SN 取时间最近的一次
时间: 2024-02-24 20:56:50 浏览: 121
可以使用 LEFT JOIN 操作将两个数据表组合起来,然后使用 GROUP BY 操作,对 SN 列进行分组,取出最近的一条记录。具体的 SQL 语句如下:
```
SELECT dt.sn, dtl.PvResult, dtl.BatResult
FROM dt
LEFT JOIN dtLH AS dtl ON dt.sn = dtl.InverterSN
LEFT JOIN (
SELECT sn, MAX(recordid) AS max_recordid
FROM dt
GROUP BY sn
) AS max_dt ON dt.sn = max_dt.sn AND dt.recordid = max_dt.max_recordid
GROUP BY dt.sn, dtl.PvResult, dtl.BatResult
```
上面的 SQL 语句中,首先将两个数据表 dt 和 dtLH 进行 LEFT JOIN 操作,然后再将结果与一个子查询的结果进行 LEFT JOIN 操作,子查询用于获取每个 SN 列最近的一条记录。最后,对 SN 列进行分组,取出最近的一条记录。
相关问题
C# 有两个datatable dt和datatable dtBZ, dt里包含列recordid,orderid,sn,dtLH里包含InverterSN,bzTestTime, 组合两张表要求显示不重复的列SN,bzTestTime ,若出现相同SN 取时间最近的一次
可以使用以下代码将两个DataTable组合并去重:
```csharp
//先将两个DataTable按照 SN 字段进行内连接
var result = from row1 in dt.AsEnumerable()
join row2 in dtBZ.AsEnumerable()
on row1.Field<string>("SN") equals row2.Field<string>("InverterSN")
select new
{
SN = row1.Field<string>("SN"),
BZTestTime = row2.Field<DateTime>("bzTestTime")
};
//再按照 SN 进行分组,取每组中 BZTestTime 最大的记录
var finalResult = from row in result
group row by row.SN into g
select new
{
SN = g.Key,
BZTestTime = g.Max(x => x.BZTestTime)
};
//将结果转换为 DataTable 格式
DataTable dtResult = new DataTable();
dtResult.Columns.Add("SN", typeof(string));
dtResult.Columns.Add("BZTestTime", typeof(DateTime));
foreach (var row in finalResult)
{
dtResult.Rows.Add(row.SN, row.BZTestTime);
}
```
注意:以上代码假设 SN 字段的数据类型为 string,BZTestTime 字段的数据类型为 DateTime。如果数据类型不同,需要适当修改代码。
C# 有两个datatable dt和datatable dtGN,dt里包含列recordid,orderid,sn,dtzz里包含InverterSN,TestResult,TestTime,组合两张表要求显示不重复的列SN,TestResult,TestTime,若出现相同SN 取时间最近的一次
可以使用 LINQ 进行两个 DataTable 的关联操作,并根据要求进行筛选,示例代码如下:
```csharp
// 获取 dt 和 dtGN 的关联数据
var query = from row1 in dt.AsEnumerable()
join row2 in dtGN.AsEnumerable()
on row1.Field<string>("sn") equals row2.Field<string>("InverterSN")
select new {
SN = row1.Field<string>("sn"),
TestResult = row2.Field<string>("TestResult"),
TestTime = row2.Field<DateTime>("TestTime")
};
// 按照 SN 分组,取 TestTime 最大值(即最近的时间)
var result = query.GroupBy(x => x.SN)
.Select(g => g.OrderByDescending(x => x.TestTime).FirstOrDefault())
.ToList();
```
其中,`query` 变量表示关联数据的集合,`result` 变量表示最终筛选后的结果,可以将其绑定到数据控件或进行其他处理。注意,在使用 LINQ 进行关联操作时,需要确保两个 DataTable 中的列类型和名称相同。
阅读全文