G'day, मैं मूल्यों और असफलताओं के बीच संगतता या समानता को क्वेरी करने का एक तरीका विकसित करने का प्रयास कर रहा हूं। यह उच्चतम या निम्नतम AVG रेटिंग नहीं है, बल्कि किसी संख्या या पंक्तियों के मानों के बीच सबसे छोटा अंतर है। तो यदि संरचना निम्न की तरह कुछ है जहां रैंक उपयोगकर्ता द्वारा "रेटिंग" है।

USER  ITEM   RANK
A      x      5
B      x      6
C      x      2
A      y      2
B      y      3
C      y      8
A      z      7
B      z      4
C      z      4

अंत में मैं डेटा को सॉर्ट करने में सक्षम होना चाहता हूं जैसे:

उपयोगकर्ता A बनाम उपयोगकर्ता B का औसत रेटिंग अंतर 3 . है

उपयोगकर्ता A बनाम उपयोगकर्ता C का औसत रेटिंग अंतर 4 . है

उपयोगकर्ता B बनाम उपयोगकर्ता C का औसत रेटिंग अंतर 5 . है

मेरा अब तक का एकमात्र विचार हर क्रमपरिवर्तन के साथ एक अस्थायी तालिका (विशाल) बनाना है:

col1  col2  dif   item
A      B      1      x
A      C      3      x

आदि... और फिर एक समूह के साथ योग। लेकिन यह अभी भी उन अवसरों के साथ ठीक से व्यवहार नहीं करता है जहां उपयोगकर्ता ए और सी कुछ वस्तुओं के करीब मिलते हैं और प्रारंभिक निकटता को पछाड़ने के लिए अन्य वस्तुओं पर अधिक अंतर रखते हैं। कोई दिशा दे सकता है?

धन्यवाद!

यह एक MySQL 5.5 डीबी है इसलिए मुझे कोई सीटीई या क्वेरी संरचना की तरह याद आ रही है।

1
barnamos 6 अक्टूबर 2017, 23:46

1 उत्तर

सबसे बढ़िया उत्तर

स्वयं शामिल होने का उपयोग कर सकता है

select a.user, b.user, abs(a.rank - b.rank) diff_rank, a.item
from my_table a
inner join my_table b on a.item  = b.item and a.user <> b.user
order by item, diff_rank asc

डुप्लिकेट मान से बचने के लिए आप विशिष्ट का उपयोग कर सकते हैं

select distinct a.user, b.user, abs(a.rank - b.rank) diff_rank, a.item
from my_table a
inner join my_table b on a.item  = b.item and a.user <> b.user
order by item, diff_rank asc

और सबसे कम अंतर वाले उपयोगकर्ताओं को प्राप्त करने के लिए आप आदेश को बदल सकते हैं

select distinct a.user, b.user, abs(a.rank - b.rank) diff_rank, a.item
from my_table a
inner join my_table b on a.item  = b.item and a.user <> b.user
order by diff_rank asc
0
scaisEdge 8 अक्टूबर 2017, 08:50
धन्यवाद! जो परिणामों को दोगुना करने के बावजूद प्रत्येक आइटम रैंक के लिए परिणाम एकत्र करने में अच्छा काम करता है। कई मदों में सबसे कम संयुक्त diff_rank वाले उपयोगकर्ताओं की जोड़ी ढूँढना अभी भी मुझे दूर कर रहा है। मुझे लगता है कि मैं प्रत्येक उपयोगकर्ता जोड़ी के लिए सरणी स्क्रिप्ट कर सकता हूं और mysql के बाहर diff_rank कुल कर सकता हूं? a.user-b.user b.user-a.user डुप्लिकेट को भी फ़िल्टर कर सकते हैं। हालांकि मैं यह सब MySQL में कर सकता था।
 – 
barnamos
7 अक्टूबर 2017, 01:10