Multi-Sütun tamsayı Sipariş

4 Cevap php

Ben bu soru için uygun bir başlık (değilse, buna göre değiştirin lütfen) seçilmiş ama ben çalışıyorum aşağıdaki basitleştirilmiş tablo yapısını dikkate ettik eğer ben bilmiyorum:

----------------------------------------------
|  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, tüm ilişkili olmayan, tamsayılar / yüzen, hepsi farklı faktörleri temsil eden ve büyüklük çok farklı emir ( i değişebilir olabilir 1 - 1000 j 100 arasında olabilir em>).

Ben benzer koşullar paylaşmak tarihleri ​​seçmeye çalışıyorum; i bir dizi göz önüne alındığında, j, k, x, y, {[(5)] ı return all results ordered by closeness, bir bütün olarak değerlerin for instance, if i = 1, j = 2, k = 3, x = 4 mi} değerleri, y = 5 ve z = 6 sorgu bu sırayla aşağıdaki tarihleri ​​dönmesi gerekir:

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

I'm not sure if this is relevant or not to the question, but some values (i, j, k) ortalama more is better ise diğer değerler (x, {[(5)] }, z) tersi anlama:. less is better

How I should build such a query? Is this possible with SQL alone?


@Pentium10:

Senin yorumuna elimden en iyi şekilde cevap vermeye çalışacağım. İşte benim verilerin bir örnek:

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

Benim tablo yapısı satırlarının daha fazla sütun ve binlerce var ama umarım bu benim açımdan net almak için yeterli olacaktır. Ben muhtemelen yanlış olsun çünkü benim önceki örnekte olduğu gibi bu değerleri sipariş girişimi için gitmiyorum, ama temelde bu verilerle sorguları iki tür yapmanız gerekir:

  1. show me all dates, ordered by the resemblance of the conditions provided by me
  2. show me all dates, ordered by the resemblance of the conditions observed in date X

Ben ikinci sorgu kolayca ilkini kullanarak arşivlenmiş olabilir anlıyorum, ama benim sorunum birkaç sütun kullanarak benzerlik göre sıralama yatıyor, ben ordered by closeness, bir bütün {[(gibi tüm değerlerin "demek ne 1)]} ama kafam gerçekten çok sütun ile uğraşırken dönmeye başlar.

The goal is to to be able to produce results like this:

Today is really similar to d/m/yy, very similar to d/m/yy, somewhat similar to d/m/yy, ...

Benim durumumda hava ve atmosfer verilerle çalışıyorum ama sanırım yardımcı olur eğer employees (attendance sahip olma açısından bu sorun, aklınıza gelebilecek {[(2)] } ve monthlySalary sütunlar) ve en yakın mesela, attendance = 100%, hoursPerWeek = 40 ve monthlySalary = $5000 benzer çalışanlar tarafindan.

PS: Şimdi bu çalışanların örnek verdiğim çalışanların tablo ile size ({[(hesaplayabiliriz çünkü ben çalışıyorum hava örnek göre olabilir eğer ben artık gerçekten emin değilim 1)]} örneğin) ve tür sütunları ağırlık, ama ben aynı hava tablo ile yapılabilir sanmıyorum -. input is appreciated anyhow

PS2: Ben de kendimi yeterince ifade eğer hala şüpheniz varsa lütfen bana bildirin, emin değilim .


Bounty

Some good suggestions so far, however none of them truly solve my problem. I'm setting up a bounty to hopefully gather even more possible solutions to this problem. Thanks.

4 Cevap

Eğer var gibi sorun her sütun farklı bir ölçek vardır ve böylece bunları kolayca birleştirmek değil ki. Bu sorun, beyazlatma denilen bir yöntemle çözülebilir. Bu (1 SQL deyimi bu yapabileceğini) her sütunun ortalama ve standart sapma hesaplanırken ve seçerken sonra bu her sütunu rescaling içerir:

colSortPos = (colValue-colMean) / colStdev

Benzer tarihler birlikte böylece hüner bu birleştirmek için 1 + / - aralığında 1 standart sapma -. Bu yapmak size hangi + / 0 civarında değişen her sütunu verecektir. Burada sorun bu 2 boyutlu bir sorun değildir ve bu nedenle çok boyutlu düşünmek gerekir olmasıdır. Yani benim önerim onun sizin sıralama gibi Öklid uzaklığı almak.

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

Bu konuda tek sorun bazı korelasyon özledim yapabilir 1 boyutlu bir uzayda üzerine sorununuzu projeleri olduğunu. Ben uygulamak oldukça basit ve gerçekten hızlı K-aracı gibi kümeleme tekniği kullanarak öneririz Bu geçici bir çözüm. Bu en benzerlik görüntülemek k kümeler halinde gruplandırmak tarihleri ​​size sağlayacaktır [http://en.wikipedia.org/wiki/K-means_clustering]. Eğer ham veri var ve bu (ve diğer) teknikleri ile oynamak istiyorsanız o zaman ben [http://www.cs.waikato.ac.nz/ml/weka/] Bu teknikler etrafında oynamaya izin hangi weka araç seti denemenizi öneririz.

Ben bunun mümkün olduğunu düşünüyorum. Farkı kadar ekler bir işlevi kullanarak deneyin. Örneğin:

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

Bu size bulanık mantık farkı değerini verecektir. Alt, yakın maç. Ayrıca, bu ifadeye göre sıralamak gerekir: ABS tarafından, yani sipariş (i - i @) ... ASC

Birkaç öneri, belki geçici bir tabloya sonuçlarını seçmek ve bu sıralamak.

.. SQL sunucusu kullanıyorsanız Alternatif olarak, eğer NET CLR kullanarak ve bir NET montaj bunu yapıyor bakmak - bu size daha fazla güç ve seçenekler verecektir. (Bazı alanların ek ağırlık olmalıdır demek ise) o da daha kolay, belirli alanlara ekstra ağırlık takmak için izin verecektir.

Hope this helps, Steve

I'm not sure if this is relevant or not to the question, but some values (i, j, k) mean more is better while other values (x, y, z) mean the opposite: less is better.

Since you are dealing with dates, you may want to derive other dates based on these criteria.
For example you can compute new dates, for a value having a higher effect you add couple of hours/days/weeks/months to your date, and if a value has a lover effect you add just seconds/minutes to your dates. Then you sort based on this computed new date.
You can subtract dates using negative compensations if they reach a peak level

Bulanık SQL Çıkış (FSQL)

EDIT 1

Bunu deneyin: 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

Bu SQL yapmak zor (eğer imkansız değilse), ancak Faktör Analizi denilen bir çok değişkenli analiz tekniği var. Bir "faktör skoru" elde etmek için her girişte bir ağırlık koyar değişkenlerin doğrusal bir kombinasyonu - Bu bir "faktör" yaratmanın bir yoludur. Temelde (toplam hataları gibi), bazı nesnel minimize puan ayarlanmış bir single oluşturmak için veri lineer cebirsel manipülasyonlar bir demet yapar.

Ben saatlik hava durumu verileri 3 gün bir faktör analizi yaptım ve oldukça iyi görünüyor. Siz benzer faktör puanları ile girişleri genellikle dört önlemler arasında değerlerine çok yakın olduğunu görebilirsiniz. Ben bir Equimax rotasyonu ile bir ana bileşen ekstraksiyonlanm kullandı:

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