当前位置: 首页 > 面试题库 >

多列整数排序

葛言
2023-03-14
问题内容

我不知道是否为此问题选择了合适的标题(如果没有,请相应地更改它),但是请考虑以下我正在使用的简化表结构:

----------------------------------------------
|  date  |  i  |  j  |  k  |  x  |  y  |  z  |
----------------------------------------------
| 100209 |  1  |  2  |  3  |  4  |  5  |  6  |
----------------------------------------------
| 100210 |  2  |  3  |  4  |  5  |  6  |  7  |
----------------------------------------------
| 100211 |  0  |  1  |  2  |  3  |  4  |  5  |
----------------------------------------------
| 100212 |  1  |  2  |  3  |  4  |  5  |  6  |
----------------------------------------------
| 100213 |  6  |  5  |  4  |  3  |  2  |  1  |
----------------------------------------------

ijkxyz都是不相关的整数/浮筒,它们都代表不同的因素,并可以具有数量级的非常不同的顺序( i 范围可从1 -
10,而j的范围可以从100 - 1000
)。

我正在尝试选择条件相似的日期。给定一组ijkxyz值我需要 返回由下令所有结果 接近
所有值作为一个整体
,例如,如果i = 1j = 2k = 3x = 4y = 5z = 6查询应按此顺序返回日期如下:

  1. 100209
  2. 100212
  3. 100210
  4. 100211
  5. 100213

我不知道这是否是相关或不的问题,但一些值( ijk)的意思是 越多越好 ,而其他值( xyz)的意思正好相反:
越少越好

我应该如何建立这样的查询? 仅使用SQL是否有可能?

我会尽力回答您的意见。这是我的数据样本:

---------------------------------------------------------------------------------
  date  |  temperature  |  humidity  |  pressure  |  windSpeed  |  moonDistance  
---------------------------------------------------------------------------------
 090206 |  7            |  87        |  998.8     |  3          |  363953        
---------------------------------------------------------------------------------
 ...... |  ...          |  ...       |  ....      |  ...        |  ......        
---------------------------------------------------------------------------------
 100206 |  10           |  86        |  1024      |  2          |  386342        
---------------------------------------------------------------------------------
 100207 |  9            |  90        |  1015      |  1          |  391750        
---------------------------------------------------------------------------------
 100208 |  13           |  90        |  1005      |  2          |  396392        
---------------------------------------------------------------------------------
 100209 |  12           |  89        |  1008      |  2          |  400157        
---------------------------------------------------------------------------------
 100210 |  11           |  92        |  1007      |  3          |  403012        
---------------------------------------------------------------------------------
 100211 |  6            |  86        |  1012      |  2          |  404984        
---------------------------------------------------------------------------------
 100212 |  6            |  61        |  1010      |  3          |  406135        
---------------------------------------------------------------------------------
 100213 |  7            |  57        |  1010      |  2          |  406542        
---------------------------------------------------------------------------------

我的表结构具有更多的列和数千行,但是希望这足以使我的观点清楚。我不会尝试像上一个示例中那样对这些值进行排序,因为我可能会弄错了,但是我基本上需要使用此数据执行两种类型的查询:

  1. 显示我所有的日期,并按照我提供的条件进行排序
  2. 显示我所有的日期,并按照日期X中观察到的条件进行排序

我知道可以通过使用第一个查询轻松地归档第二个查询,但是我的问题在于使用几列进行相似排序,这就是我的意思,即“ 按 整体上所有值的 紧密
程度进行排序
”。就像,如果我只处理一列,按 相似性 排序会容易 得多, 但是当处理几列时,我的头确实开始旋转。

目标是能够产生如下结果:

今天确实类似于d / m / yy,非常类似于d / m / yy,有点类似于d / m / yy,…

就我而言,我与天气和大气数据工作,但如果它可以帮助我猜你能想到在这个问题上来讲employees(有attendancehoursPerWeekmonthlySalary通过员工认为最相似列)和秩序attendance = 100%hoursPerWeek = 40monthlySalary = $5000为实例。

PS:
现在我已经给出了这个雇员示例,现在我不确定是否可以将其与我正在使用的天气示例进行比较,因为有了employees表,您可以计算(rating = monthlySalary / hoursPerWeek * attendance例如)列的权重但是我认为天气表不能做到同样的事情-
无论如何,我们赞赏大家的投入

PS2 :我不确定我是否表现得足够好,如果您仍有疑问,请告诉我。

赏金

到目前为止,有一些好的建议,但是没有一个能真正解决我的问题。我设立了一个赏金计划,希望能为该问题收集更多可能的解决方案。谢谢。


问题答案:

您似乎遇到的问题是每一列的比例都不同,因此您很难轻松地将它们组合在一起。可以使用称为增白的技术解决此问题。这涉及到计算每列的平均和标准偏差(您可以在1条SQL语句中执行此操作),然后在选择时将每列缩放为该值:

colSortPos = (colValue-colMean) / colStdev

这样做会使每一列的范围在0左右,标准偏差在+/- 1范围内,+
/-1。这里的问题是,这不是二维问题,因此您需要进行多维思考。因此,我的建议是将欧几里德距离作为您的排序顺序。

SELECT
    date,
    i,
    j,
    k,
    SQRT( POW((i-@iMean)/@iStdDEv, 2) + POW((j-@jMean)/@jStdDEv, 2) + POW((k-@kMean)/@kStdDEv, 2) )
AS
    sort_order
FROM
    table
ORDER BY
    sort_order

唯一的问题是,它将问题投影到一维空间上可能会使您错过一些相关性。要解决此问题,我建议使用像K-
means这样的聚类技术,该技术实施起来非常简单,而且速度非常快。这将允许您将日期分组为k个群集,这些群集显示最相似的[
http://en.wikipedia.org/wiki/K-means_clustering
]。如果您有原始数据并想使用这些(和其他)技术,那么我建议您尝试使用weka工具包[
http://www.cs.waikato.ac.nz/ml/weka/
],它将使您能够玩这些技术。



 类似资料:
  • 有一个集合,例如(1,4,2,5,7,6,9,8,3)。我们通过以下方式计算它的(FD):。inputArray是原始集。例如大小写为(1,4,2,5,7,6,9,8,3)。first差异是从inputArray创建的,方法如下:(inputArray的第二个元素)-(inputArray的第一个元素)等等。 所以给定集合的FD是(3,-2,3,2,-1,3,-1,-5)。任务是找到给定集合的多个

  • 问题内容: 我想对整数的arraylist的arraylist进行排序,需要帮助吗? 我被告知,我需要实现比较器或可比对象,然后使用collection.sort对列表列表进行排序… 问题答案: 没有错误检查空列表,但是这里是。 使用Java 8,它变得更加简洁:

  • 问题内容: 我有一个SQLite表,其格式如下: 学生列中有学生姓名,其他列中有描述各个科目的分数的数值。我想为每个学生找到的是他们学科的排名。例如,对于该行, 我想要的输出是 这是每个学生的全部5门科目的排名。输出不必采用我显示的格式。我只需要一个输出,指示每个学生每个学科的排名。如何在SQLite中实现它? 我发现了RANK和ROW_NUMBER,但不了解如何将它们用于多列。 问题答案: 我的

  • 问题内容: 我得到以下结果 我要订购最近发生的事件。供应商具有最新的事件,因此应该首先与同一供应商的所有其他事件一起发生,然后是所有事件均按降序排列的下一个供应商。期望的结果是这样的- 没有给出期望的输出。有什么帮助吗? 问题答案: 使用分析功能: 请参阅: http: //docs.oracle.com/javadb/10.8.2.2/ref/rrefsqlj13658.html http://

  • 我用的是拉威尔的背包,积垢舱。 如何将orderby()用于多列? 例子: 我看到src和orderby只接受一个参数。 有什么建议吗?