多列整数排序

时间:2010-02-13 11:27:30

标签: php sql mysql math sqlite

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

----------------------------------------------
|  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值,我需要返回所有订购的结果例如, closeness 所有值,如果i = 1j = 2k = 3x = 4,{{1 }}和y = 5查询应按此顺序返回以下日期:

  1. 100209
  2. 100212
  3. 100210
  4. 100211
  5. 100213
  6. 我不确定这是否与问题相关,但有些值(z = 6ij)表示更多更好而其他值(kxy)则相反: less is better

    我应该如何构建这样的查询?单独使用SQL是否可以实现这一点?


    @ Pentium10:

    我会尽力以最好的方式回答你的评论。以下是我的数据示例:

    z

    我的表格结构有更多的列和数千行,但希望这足以让我的观点清楚。我不会像我之前的例子那样尝试订购这些值,因为我可能会弄错,但我基本上需要对这些数据进行两种类型的查询:

    1. 告诉我所有日期,按照我提供的条件的相似性排序
    2. 显示所有日期,按日期X中观察到的条件的相似性排序
    3. 我理解第二个查询可以通过使用第一个查询轻松归档,但我的问题在于使用多个列按相似性排序,这就是我所说的“ closeness 排序所有价值观作为一个整体“。就像在,如果我只处理一个列,那么通过 likeness 订购就会容易得多,但在处理多个列时,我的脑袋真的开始旋转。

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

        

      今天与d / m / yy非常相似,   有点像d / m / yy非常相似   类似于d / m / yy,......

      在我的情况下,我正在使用天气和大气数据,但如果它有帮助我猜你可以用--------------------------------------------------------------------------------- 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 --------------------------------------------------------------------------------- employeesattendance和{hoursPerWeek来考虑这个问题{1}}列)和员工订购的内容最相似monthlySalaryattendance = 100%hoursPerWeek = 40

      PS: 现在我已经给了这个员工的例子我不再确定它是否可以与天气例子相比我是使用,因为有了employees表,你可以计算(例如monthlySalary = $5000)并对列进行加权,但我不认为天气表可以做同样的事情 - 输入无论如何都值得赞赏< /强>

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


        

      恩惠

           

      到目前为止,一些好的建议   他们都没有真正解决我的问题。   我希望能够获得赏金   收集更多可能的解决方案   这个问题。感谢。

4 个答案:

答案 0 :(得分: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]的k个群集。如果您有原始数据并希望使用这些(和其他)技术,那么我建议您尝试使用weka工具包[http://www.cs.waikato.ac.nz/ml/weka/],这将让您可以使用这些技术。

答案 1 :(得分:3)

我认为这是可能的。尝试使用能够增加差异的功能。例如:

SELECT *,ABS(i - @i)+ ABS(j - @j)+ ABS(k - @k)+ ABS(x - @x)+ ABS(y - @y)+ ABS(z - @z) 从表

这将为您提供模糊逻辑差值。越低,越接近匹配。您还应该能够按此表达式排序:即按ABS(i - @i)排序... ASC

一些建议,或许可以将结果选择到临时表并对其进行排序。

或者,如果您使用的是SQL Server,请查看使用.NET CLR并在.NET程序集中执行此操作 - 这将为您提供更多功能和选项。它还允许您更轻松地将额外的重量附加到某些字段(如果您的意思是某些字段应该有额外的权重)。

希望这有帮助, 史蒂夫

答案 2 :(得分:1)

  

我不确定这是否相关或   不是问题,而是一些价值观   (i,j,k)意味着更多更好   其他值(x,y,z)表示   相反:越少越好。

由于您正在处理日期,您可能希望根据这些标准推导出其他日期 例如,您可以计算新日期,对于具有higher effect的值,您可以为您的日期添加几个小时/天/周/月,如果值为lover effect,则只需添加秒/分钟到你的约会。然后根据计算出的新日期进行排序 如果日期达到峰值水平,您可以使用负补偿减去日期

查看模糊SQL(FSQL

编辑1

试试这个:std(i)* abs(i- @ i)...

SELECT 
  (select std(i) from fuzzysearch)*abs(i-7) as v1,
  (select std(j) from fuzzysearch)*abs(j-90) as v2,
  f.* 
FROM fuzzysearch as f 
order by 
  v1 asc, 
  v2 desc

答案 3 :(得分:1)

这在SQL中很难(如果不是不可能),但有一种称为因子分析的多变量分析技术。这是一种创建“因子”的方式 - 变量的线性组合,它对每个输入加权以获得“因子得分”。基本上它会对您的数据进行一系列线性代数操作,以创建一组单分,最大限度地减少某些目标(如总误差)。

我对3天的每小时天气数据进行了因子分析,看起来非常不错。您可以看到,具有相似因子分数的条目通常在所有四个度量中的值非常接近。我使用Equimax旋转的主成分提取:

Wind    Air    Dewpoint    BP         Score
-------------------------------------------
3       12     9           1012.2     -2.72
5       17     11          1011.9     -1.77
5       16     10          1010.8     -1.75
6       15     10          1010.4     -1.68
3       19     13          1012.1     -1.57
5       17     11          1010.8     -1.54
7       17     12          1012.0     -1.53
8       19     12          1012.0     -1.24
5       20     14          1012.0     -1.18
7       17     12          1009.8     -1.06
9       20     13          1012.5     -1.05
8       21     12          1012.1     -1.05
7       19     11          1009.9     -0.98
6       18     13          1009.6     -0.90
0       24     17          1012.1     -0.90
8       20     12          1010.8     -0.88
5       22     15          1012.0     -0.87
10      21     12          1012.0     -0.86
8       21     12          1010.8     -0.78
9       19     12          1010.2     -0.78
8       23     10          1010.7     -0.76
6       23     15          1012.3     -0.75
7       20     12          1009.7     -0.73
7       20     12          1009.6     -0.71
10      22     14          1011.5     -0.45
7       19     15          1009.3     -0.45
6       20     16          1009.7     -0.41
7       20     15          1009.4     -0.37
10      24     12          1010.6     -0.26
5       26     18          1012.5     -0.26
9       23     15          1011.0     -0.22
12      24     16          1012.3     -0.04
6       25     16          1009.5      0.15
5       28     20          1012.5      0.16
0       28     17          1009.0      0.16
8       24     17          1010.2      0.17
3       30     20          1012.5      0.19
12      23     16          1010.6      0.21
8       25     15          1009.5      0.21
13      25     13          1010.5      0.22
13      25     14          1010.6      0.30
5       25     20          1010.1      0.35
6       25     19          1009.9      0.37
9       23     18          1009.5      0.40
13      25     15          1010.3      0.46
5       30     21          1012.4      0.48
7       26     19          1010.0      0.54
12      27     16          1010.9      0.56
8       24     20          1009.7      0.58
7       27     17          1009.2      0.60
7       27     18          1009.6      0.62
7       27     17          1009.0      0.64
8       26     21          1010.6      0.70
9       28     17          1009.8      0.75
8       25     22          1010.0      0.82
8       26     23          1010.8      0.86
8       25     22          1009.8      0.87
8       25     23          1010.1      0.91
9       26     22          1010.5      0.91
8       26     22          1009.8      0.97
14      29     17          1010.8      1.06
12      26     22          1010.8      1.09
10      31     18          1010.3      1.14
14      30     18          1010.7      1.28
17      29     17          1010.9      1.29
10      27     22          1009.4      1.32
12      26     22          1009.7      1.32
8       27     24          1009.3      1.38
14      27     22          1010.2      1.49
12      28     22          1009.8      1.51
16      31     19          1010.7      1.66
14      28     23          1009.6      1.82