从动态数据表中查找行中的最小值

Posted

技术标签:

【中文标题】从动态数据表中查找行中的最小值【英文标题】:Find Min value in row from Dynamic Datatable 【发布时间】:2013-09-13 15:31:32 【问题描述】:

所以我有 2 个数据表,第一个数据表是一个传统的数据表,它从某些 sql 语句中获取数据。

数据表1:

 | user_point |  | lat       |  | lng        |  | radius      |
 --------------------------------------------------------------
 | userpoint0 |  | 43.702943 |  | -79.37478  |  | 3.10685596  | 
 | userpoint1 |  | 43.672655 |  | -79.479837 |  | 4.970969536 |

但是,某些列是根据数据表 1 中的用户点数在数据表 2 中动态生成的。

 | id    |    | lat              | | lng               |  | DistanceFromUserpoint0 | | DistanceFromUserpoint1 | 
 -------------------------------------------------------------------------------------------------------------
 | 23184 |    | 43.6495246887207 | | -79.4244003295898 |  | 4.4464409231533  |       | 3.19880848195014 | 
 | 37957 |    | 43.6372413635254 | | -79.4151458740234 |  | 4.96760996486758 |       | 4.05524888969018 | 
 | 37965 |    | 43.636589050293  | | -79.4169921875    |  | 5.04670564187353 |       | 4.00990129127938 | 
 | 60467 |    | 43.735538482666  | | -79.4437942504883 |  | 4.11692339031897 |       | 4.70303114025665 | 
 | 60475 |    | 43.735538482666  | | -79.4437942504883 |  | 4.11692339031897 |       | 4.70303114025665 | 
 | 65615 |    | 43.7292861938477 | | -79.4317932128906 |  | 3.37923630122185 |       | 4.59015403452972 | 
 | 65623 |    | 43.7292861938477 | | -79.4317932128906 |  | 3.37923630122185 |       | 4.59015403452972 | 
 | 3196486 |  | 43.6624603271484 | | -79.4242172241211 |  | 3.7316961595166  |       | 2.86768157143755 | 
 | 3196494 |  | 43.6624603271484 | | -79.4242172241211 |  | 3.7316961595166  |       | 2.86768157143755 | 
 | 5756393 |  | 43.719165802002  | | -79.4295654296875 |  | 2.95683309139676 |       | 4.07847187106957 | 
 | 5756922 |  | 43.719165802002  | | -79.4295654296875 |  | 2.95683309139676 |       | 4.07847187106957 | 
 | 5756956 |  | 43.719165802002  | | -79.4295654296875 |  | 2.95683309139676 |       | 4.07847187106957 | 
 | 5756991 |  | 43.719165802002  | | -79.4295654296875 |  | 2.95683309139676 |       | 4.07847187106957 | 
 | 5757096 |  | 43.719165802002  | | -79.4295654296875 |  | 2.95683309139676 |       | 4.07847187106957 |
 | 5757134 |  | 43.719165802002  | | -79.4295654296875 |  | 2.95683309139676 |       | 4.07847187106957 |

现在我将在数据表 2 的末尾添加一个名为 Closest_userpoint 的新列,它将存储距离的值,该距离是该行最近的用户点。

所以现在我的问题是如何找到该行的最小/最小值,该行具有动态生成的列(这意味着可以有从无到 100 的任意数量的用户点)。我正在寻找一个最简单最有效的答案,谢谢

编辑:

这是我如何创建动态列的代码,但是我坚持要根据距离用户点的距离,找出用该行的最小值填充最接近用户点列的逻辑

编辑 2:

额外问题:

最后,我想确定最接近的 Point/Min 值是否在最接近的用户点的 raidus 范围内。

【问题讨论】:

有几种方法可以做到这一点。你能告诉我们你到目前为止尝试/想到了什么吗? 我发布了我的代码,说明我是如何动态计算距离用户点的距离并创建列的 不确定是否相关,但 SQL2008 会使用一些新的地理特征为您执行这种“离 X 最近的点” 我希望一切都在 C# 代码本身中完成,因为我根本没有在 sql 中保存我的距离值,因为有列是动态生成的,如果我保存它们不会很有效在这样的sql中 @AdrianCarneiro 如果我可以用 sql 本身更有效地做到这一点,而不使用 c# 请建议如何编写我的查询来获取最近点、table1(userpoint, lat, lng, radius) 和 table2 (id, lat, lng) 【参考方案1】:

如果您在填充值后尝试找到最小值会更容易

使用 System.Linq;对于 Min() 方法

if (userpoints.Rows.Count > 1)

foreach (DataRow dr in selectedPanels.Rows)

List<string> alluserpoints = new List<string>();             
for (int i = 0; i < userpoints.Rows.Count; i++)

if (Convert.ToDouble(userpoints.Rows[i].radius) > Convert.ToDouble(dr["DistanceFromUserpoint" + i]))

    alluserpoints.Add(dr["DistanceFromUserpoint" + i]+"+userpoint"+i);


if(alluserpoints.Count>0)
dr["Closest_UserPoint"] = alluserpoints.Min();  
else
dr["Closest_UserPoint"] ="none";                        


else

foreach(DataRow dr in selectedPanels.Rows)

if(Convert.ToDouble(userpoints.Rows[0].radius>Convert.ToDouble(dr["DistanceFromUserpoint0"])

dr["Closest_UserPoint"]=dr["DistanceFromUserpoint0"]+"+userpoint0";

else

dr["Closest_UserPoint"]="none";



【讨论】:

我不想使用 Linq,因为我没有在代码中的其他任何地方使用它。这可行,但你能建议一个不使用 linq 的解决方案吗? 另外,我还需要弄清楚。如果该最近点/距离在该用户点的半径范围内。 然后您可以使用 Sort() 方法对所有用户点列表进行排序,并将所有用户点 [0] 分配给最近的用户点。它不是最有效的解决方案,但如果您真的特别喜欢在 C# 代码中执行此操作,请使用它。 @programmer_41 哦,那我猜你必须使用 LINQ。在没有 LINQ 的情况下这样做太复杂了。 @programmer_41 我已经编辑了我的答案,以便只考虑半径内的距离并将其添加到列表中。

以上是关于从动态数据表中查找行中的最小值的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark 的 Dataframe 行中查找最小值

在 Excel 中查找具有多种数据类型的行中的最小日期

使用SQL查找多列行中的最小值

Spark SQL 从数据源动态获取最大值和最小值

行中的动态选择

从动态添加的表行中获取数据