簡體   English   中英

多列整數排序

[英]Multi-Column Integer Ordering

我不知道我是否為這個問題選擇了合適的標題(如果沒有,請相應更改),但請考慮以下我正在使用的簡化表結構:

----------------------------------------------
|  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是否可行?


@ Pentium10:

我會盡力以最好的方式回答你的評論。 以下是我的數據示例:

---------------------------------------------------------------------------------
  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/ ]圍繞這些技術。

我認為這是可能的。 嘗試使用能夠增加差異的功能。 例如:

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程序集中執行此操作 - 這將為您提供更多功能和選項。 它還允許您更輕松地將額外的重量附加到某些字段(如果您的意思是某些字段應該有額外的權重)。

希望這有幫助,史蒂夫

我不確定這是否與問題相關,但是一些值(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

這在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM