2010-02-13 53 views
6

我不知道,如果我選擇了這一問題的合適的標題(如果沒有,請相應修改),但考慮下面的簡化表結構我的工作:多列的整數訂購

---------------------------------------------- 
| 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查詢應按此順序返回日期如下:

我不知道這是否是相關或不的問題,但一些值(ijk )意思是更多更好而其他值(x,y,z)的意思是相反的:越少越好

我該如何構建這樣的查詢?單獨使用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 /日, 非常相似,d/M /日,有些 類似d/M /日,...

對我來說,我與天氣和大氣數據工作,但如果它可以幫助我猜你能想到這個問題的employees方面(有attendancehoursPerWeekmonthlySalary欄)以及員工的最接近attendance = 100%,hoursPerWeek = 40monthlySalary = $5000的訂單。

PS:現在,我考慮了員工的例子,我真的不知道了,如果它可以比作我的工作氣象例如,由於與員工表可以計算(rating = monthlySalary/hoursPerWeek * attendance例如),並有點重量的列,但我不認爲可以做到與天氣表一樣 - 輸入無論如何讚賞

PS2:我不知道,如果我自己表現不夠好,如果你還有疑問,請讓我知道。


賞金

一些很好的建議,到目前爲止,但是 他們沒有真正解決我的問題。 我正在設置一個賞金,希望 收集更多可能的解決方案 這個問題。謝謝。

+0

語言障礙的問題,你能解釋一下你的意思'的所有值作爲whole',並提供具有類似100-1000 – Pentium10 2010-02-13 11:50:19

+0

@ Pentium10其他範圍更例子:我已更新我的問題以解決您的評論,請再次檢查,謝謝。 =) – 2010-02-13 13:06:30

+0

謝謝。你做的非常出色。正如你所提到的對天氣數據的評價是相當困難的。看到我下面更新的答案。 – Pentium10 2010-02-13 13:55:27

回答

6

您似乎遇到的問題是每列都有不同的比例,所以您不能輕鬆地將它們組合起來。這個問題可以使用稱爲白化的技術來解決。這包括計算每列的平均值和標準偏差選擇時,(你可以在1個SQL語句來做到這一點),然後重新調整每一列這樣:

colSortPos = (colValue-colMean)/colStdev 

這樣做會給你每列範圍在0附近,其+/- +/- 1範圍內的標準偏差。然後,訣竅就是將這些結合起來,以便將相似的日期放在一起。這裏的問題是,這不是一個二維問題,所以你需要多維考慮。所以我的建議是將歐氏距離作爲排序順序。

SELECT 
    date, 
    i, 
    j, 
    k, 
    SQRT(POW(([email protected])/@iStdDEv, 2) + POW(([email protected])/@jStdDEv, 2) + POW(([email protected])/@kStdDEv, 2)) 
AS 
    sort_order 
FROM 
    table 
ORDER BY 
    sort_order 

唯一的問題是,它將您的問題投影到1維空間,可能會讓您錯過一些相關性。爲了解決這個問題,我建議使用像K-means這樣的聚類技術,它很容易實現,而且速度非常快。這將允許您將日期分組爲顯示最相似性的k個羣集[http://en.wikipedia.org/wiki/K-means_clustering]。如果你有原始數據並且想要使用這些(和其他)技術,那麼我建議嘗試一下weka工具包[http://www.cs.waikato.ac.nz/ml/weka/],它可以讓你使用這些技術。

+0

我認爲我在我的SQL中犯了一個錯誤,我說的歐幾里德距離只會給你最接近的意思,如果你想與一個特定的行進行比較,那麼你需要的距離: SQRT(POW(@ iTarget - ((i- @ iMean)/ @ iStdDEv),2)+ POW(@jTarget - ((j- @ jMean)/ @ jStdDEv),2)+ POW(@kTarget - (k- @ kMean)/ @ kStdDEv,2)) 當然,可以在表格中預先計算白化值,然後可以使此計算更容易。 – Neel 2010-02-15 17:58:27

+0

嗨尼爾,真的有趣的答案 - 我想知道爲什麼每個結果平方,然後總平方根?另外,是否有必要使用均值 - 我試着用((@iTarget - i)/ @ iStdDev)來解決它 - 給你衡量它們之間的標準偏差數量之間的距離。 – MrCraze 2010-02-18 10:46:01

+0

你想要做到這一點,以獲得從你感興趣的點到你所處的點的距離。考慮一個直角三角形,爲了得到從(x1,y1)到(x2,y2)的距離,您可以找到sqrt((x1-x2)^ 2 +(y1-y2)^ 2)的斜邊。在3D(x,y,z)中,這變爲sqrt((x1-x2)^ 2 +(y1-y2)^ 2 +(z1-z2)^ 2)。將您的列視爲圖上的座標軸,最相似的點將在空間上更接近。您需要考慮更多維度的列越多。你的直覺要做((@iTarget - i)/ @ iStdDev)是正確的,因爲這將測量到某個目標的距離。 – Neel 2010-02-18 13:02:16

3

我認爲這是可能的。嘗試使用增加差異的函數。例如:

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

這會給你你的模糊邏輯差異值。越低,比賽越接近。你也應該能夠通過這個表達式來排序:即通過ABS(i - @i)排序... ASC

一些建議,或許選擇結果到臨時表並對其進行排序。

或者,如果您使用的是SQL服務器,請使用.NET CLR並在.NET程序集中執行此操作 - 這將爲您提供更多的功能和選項。它也可以讓你更容易地附加額外的權重到某些領域(如果你的意思是一些領域應該有額外的權重)。

希望這有助於 史蒂夫

+0

這個查詢只爲我返回NULL。他標記了MySQL。 – Pentium10 2010-02-13 11:59:50

+2

嗨,對不起 - 是的,他做到了。所以CLR不在了。但是,MySQL也具有ABS功能。請記住,如果任何值爲空,則整個表達式將爲空。因此,如果您不希望空值計數: COALESCE(ABS(i- @ i),0)+ ....對於每個表達式 - 則空值將被視爲0。或者,你可以在那裏放置一個更高的數字,以確保空值減少相關性 - 例如,COALESCE(ABS(i- @ i),10)...取決於你想要達到的目標。我認爲這個數據中不會有空值 - 對不起。 – MrCraze 2010-02-13 12:11:52

+0

ABS(i- @ i)假設要做什麼?那裏我沒有那個@運營商。 – Pentium10 2010-02-13 12:14:35

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 
+0

不知道MySQL有一個STD()內置函數,謝謝。兩個問題:** 1)**對於'i'('v1')列,您的查詢是否會更有利(按排序)? ** 2)**爲什麼要對'v1' ASC和'v2' DESC進行排序? – 2010-02-13 14:05:27

+0

我必須使用計算的值,因爲如果你設置:10而不是「i」,它就會有所不同。用'asc'和'desc'我想強調一些列有不同的順序。如果溫度相同,則溼度越高越好。 MySQL也有'VARIANCE()'。 – Pentium10 2010-02-13 14:15:30

+0

@ Pentium10:謝謝你,關於我問的第一個問題,我並不是指計算值的使用,而是指'ORDER BY'子句本身的順序。如果有兩個或更多具有相同「排名」/順序的'v1'值,MySQL不應該主要按'v1'命令排序,並且只能按'v2'命令排序? – 2010-02-13 14:25:08

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 
+0

似乎很有趣,可能值得嘗試一下,你能給我一些關於你提到的因子分析方法的更多信息嗎? – 2010-02-18 23:40:42