2012-04-22 15 views
19

मैं तालिका के भीतर डेटा का एक सबसेट रैंक करने की कोशिश कर रहा हूं लेकिन मुझे लगता है कि मैं कुछ गलत कर रहा हूं। मुझे पोस्टग्रेज़ के लिए रैंक() सुविधा के बारे में अधिक जानकारी नहीं मिल रही है, शायद मैं गलत जगह पर देख रहा हूं। किसी भी तरह से:पोस्टग्रेस क्वेरी में रैंक कैसे करें

मैं किसी आईडी के रैंक को जानना चाहता हूं जो किसी तारीख के आधार पर तालिका के समूह के भीतर आता है।

select cluster_id,feed_id,pub_date,rank 
from (select feed_id,pub_date,cluster_id,rank() 
    over (order by pub_date asc) from url_info) 
as bar where cluster_id = 9876 and feed_id = 1234; 

मैं निम्नलिखित stackoverflow पोस्ट के बाद इस मॉडलिंग कर रहा हूँ: मेरे क्वेरी इस प्रकार है postgres rank

कारण मुझे लगता है कि मैं कुछ गलत कर रहा हूँ कि में हैं url_info में केवल 39 पंक्तियों देखते हैं कि है cluster_id 9876 और यह क्वेरी 10 मिनट तक चली गई और कभी वापस नहीं आई। (वास्तव में इसे थोड़ी देर के लिए फिर से चलाया और इसे कोई परिणाम नहीं मिला, फिर भी आईडी 1234 के लिए क्लस्टर 9876 में एक पंक्ति है) मुझे उम्मीद है कि यह मुझे कुछ बताएगा जैसे "आईडी 1234 मानदंडों के लिए 5 वां था)। postgres मेरी क्वेरी की कमी, सही के अनुसार एक रिश्तेदार रैंक वापस आ जाएगी?

यह वह जगह है 8.4 btw। सबसिलेक्ट में रैंक() फ़ंक्शन रखने और अधिक खंड या किसी विधेय में से एक विभाजन को निर्दिष्ट नहीं करके

+3

क्या आप रैंक के सापेक्ष चाहते हैं? सभी अभिलेख (यह वही है जो उपर्युक्त पूछता है और शायद यह बहुत लंबा क्यों लगता है)? भविष्यवाणी द्वारा चुने गए रिकॉर्ड का सेट? कुछ अन्य समूह? यदि आप सभी पंक्तियों पर रैंक नहीं करना चाहते हैं तो 'ओवर' खंड को 'विभाजन द्वारा' निर्दिष्ट करना चाहिए। [यहां विंडो फ़ंक्शंस पर ट्यूटोरियल है] (http://www.postgresql.org/docs/8.4/static/tutorial-window.html) – dbenhur

+0

मैं pub_date से संबंधित रैंक करना चाहता हूं। शायद मैं थोड़ा बेहतर समझा सकता हूं: url_info में हजारों यूआरएल हैं। उनमें से 39 क्लस्टर 9876 का मिश्रण करते हैं। केवल यूआरएल का चयन करके जो 9876 के सदस्य हैं (यूआरएल केवल एक क्लस्टर का सदस्य हो सकता है), मैं pub_date के आधार पर यूआरएल (जो क्लस्टर 9876 लिखता हूं) रैंक करना चाहता हूं।क्या मैं अभी भी इसके लिए विंडो फ़ंक्शंस के आधार पर विभाजन का उपयोग करता हूं? मैंने आपके द्वारा भेजे गए यूआरएल को देखा और ऐसा लगता है कि यह कुछ मूल्यों की गणना करने के बाद रैंकिंग आइटमों का जिक्र कर रहा है, जो मैं यहां नहीं कर रहा हूं .... – WildBill

उत्तर

26

उस उप-चयन में, आपकी क्वेरी pub_date द्वारा आदेशित संपूर्ण url_info तालिका पर एक रैंक तैयार करने के लिए कह रही है। यह संभव है कि यह url_info पर रैंक करने के लिए इतनी देर क्यों चल रहा था, पीजी को पूरी तालिका को pub_date द्वारा सॉर्ट करना होगा, जो एक ले जाएगा जबकि तालिका बहुत बड़ी है।

ऐसा प्रतीत होता है कि आप कहां से चयनित रिकॉर्ड्स के सेट के लिए रैंक उत्पन्न करना चाहते हैं, इस मामले में, आपको केवल उप-चयन को खत्म करने की आवश्यकता है और रैंक फ़ंक्शन निश्चित रूप से मेल खाने वाले रिकॉर्ड के सेट पर है।

select 
    cluster_id 
,feed_id 
,pub_date 
,rank() over (order by pub_date asc) as rank 
from url_info 
where cluster_id = 9876 and feed_id = 1234; 

आप वास्तव में क्या चाहते थे क्लस्टर के भीतर रैंक था, FEED_ID की परवाह किए बिना, आप एक सबसिलेक्ट जो कि क्लस्टर के लिए फिल्टर में रैंक कर सकते हैं:

select ranked.* 
from (
    select 
    cluster_id 
    ,feed_id 
    ,pub_date 
    ,rank() over (order by pub_date asc) as rank 
    from url_info 
    where cluster_id = 9876 
) as ranked 
where feed_id = 1234; 
+0

'रैंक() ओवर (पब_डेट एसी द्वारा ऑर्डर) रैंक 'अनावश्यक है , क्योंकि डिफ़ॉल्ट कॉलम नाम फ़ंक्शन का नाम – isapir

+0

@isapir हो सकता है, लेकिन यह एक मजबूत वादा नहीं है; [डॉक्स] से [https://www.postgresql.org/docs/current/static/sql-select.html#SQL-SELECT-LIST): "अधिक जटिल मामलों में एक फ़ंक्शन या प्रकार का नाम ** हो सकता है * * प्रयुक्त, या सिस्टम जेनरेट किए गए नाम जैसे कॉलम पर वापस आ सकता है? " – dbenhur

5

DENSE_RANK का एक और उदाहरण साझा करना() PostgreSQL का। शीर्ष 3 छात्रों नमूना क्वेरी खोजें। Reference taken from this blog:

नमूना डेटा के साथ एक मेज बनाएँ:

CREATE TABLE tbl_Students 
(
    StudID INT 
    ,StudName CHARACTER VARYING 
    ,TotalMark INT 
); 

INSERT INTO tbl_Students 
VALUES 
(1,'Anvesh',88),(2,'Neevan',78) 
,(3,'Roy',90),(4,'Mahi',88) 
,(5,'Maria',81),(6,'Jenny',90); 

DENSE_RANK() का उपयोग करना, छात्रों के रैंक की गणना:

;WITH cteStud AS 
(
    SELECT 
     StudName 
     ,Totalmark 
     ,DENSE_RANK() OVER (ORDER BY TotalMark DESC) AS StudRank 
    FROM tbl_Students 
) 
SELECT 
    StudName 
    ,Totalmark 
    ,StudRank 
FROM cteStud 
WHERE StudRank <= 3; 

परिणाम:

studname | totalmark | studrank 
----------+-----------+---------- 
Roy  |  90 |  1 
Jenny |  90 |  1 
Anvesh |  88 |  2 
Mahi  |  88 |  2 
Maria |  81 |  3 
(5 rows) 
संबंधित मुद्दे