我不知道我是否为这个问题选择了合适的标题(如果没有,请相应更改),但请考虑以下我正在使用的简化表结构:
---------------------------------------------- | 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 | ----------------------------------------------
i
,j
,k
,x
,y
,z
都是不相关的整数/浮筒,它们都代表不同的因素,并可以具有数量级的非常不同的顺序(i
范围可从1 - 10,而j
的范围可以从100 - 1000).
我正在尝试选择具有相似条件的日期; 给定一组i
,j
,k
,x
,y
,z
值我需要返回由下令所有结果亲近的所有值作为一个整体的,例如,如果i = 1
,j = 2
,k = 3
,x = 4
,y = 5
和z = 6
查询应按此顺序返回日期如下:
100209
100212
100210
100211
100213
我不知道这是否是相关或不的问题,但一些值(i
,j
,k
)的意思是越多越好,而其他值(x
,y
,z
)的意思正好相反:越少越好.
我应该如何构建这样的查询?单独使用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 ---------------------------------------------------------------------------------
我的表结构有更多的列和数千行,但希望这足以让我的观点清楚.我不会像我之前的例子那样尝试订购这些值,因为我可能会弄错,但我基本上需要对这些数据进行两种类型的查询:
告诉我所有日期,按照我提供的条件的相似性排序
显示所有日期,按照与日期X中观察到的条件的相似性排序
据我所知,第二个查询可以很容易地通过第一个存档,但我的问题就出在使用几列的排序相似,那就是我的意思是" 被责令亲近的所有值作为一个整体 ".就像在,如果我只处理一个列,那么通过相似性订购会容易得多,但是在处理多个列时我的头脑真的开始旋转.
目标是能够产生如下结果:
今天与d/m/yy非常相似,非常类似于d/m/yy,有点类似于d/m/yy,......
就我而言,我与天气和大气数据工作,但如果它可以帮助我猜你能想到在这个问题上来讲employees
(有attendance
,hoursPerWeek
并monthlySalary
通过员工认为最相似列)和秩序attendance = 100%
,hoursPerWeek = 40
并monthlySalary = $5000
为实例.
PS:现在我已经给出了这个员工的例子我不再确定它是否可以与我正在使用的天气示例进行比较,因为使用employees表你可以计算(rating = monthlySalary / hoursPerWeek * attendance
例如)和有点重量的列,但我不认为天气表可以做同样的事情 - 输入无论如何都会受到赞赏.
PS2:我不确定我是否表达得很好,如果你还有疑问请告诉我.
赏金
到目前为止一些好的建议,但没有一个真正解决我的问题.我正在设置一个赏金,希望能够为这个问题收集更多可能的解决方案.谢谢.
Neel.. 6
您似乎遇到的问题是每个列具有不同的比例,因此您无法轻松地将它们组合在一起.可以使用称为白化的技术来解决该问题.这涉及计算每列的平均值和标准差(您可以在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个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/ ]围绕这些技术.