Postgresql - इस डेटा को रैंक कैसे करें?

मेरा डेटा यहां है:

client_addr |  start  
------------+-----------
 1.2.3.4    |   12:54:06
 1.2.3.4    |   12:55:00
 5.6.7.8    |   12:54:06
 5.6.7.8    |   13:00:00
 5.6.7.8    |   11:00:00
 9.9.9.9    |   14:00:00

मैं इसे सॉर्ट करना चाहता हूं और इसे इस तरह रैंक करना चाहता हूं:

  RK | client_addr |    start  
-----+-------------+-----------
  1  |  1.2.3.4    |  12:54:06
  1  |  5.6.7.8    |  11:00:00
  1  |  9.9.9.9    |  14:00:00
  2  |  1.2.3.4    |  12:55:00
  2  |  5.6.7.8    |  12:54:06
  3  |  5.6.7.8    |  13:00:00

मैंने कोशिश की है

SELECT 
    rank() over (order by start ASC) as RK,
    client_addr,
    start
FROM
    my_table

लेकिन यह काम नहीं करता है।

0

2 उत्तर

ऐसा लगता है कि आप यही देख रहे हैं:

SELECT
  rank() OVER (PARTITION BY client_addr ORDER BY start) AS RK,
  client_addr,
  start
FROM my_table
ORDER BY RK, inet(client_addr)

आउटपुट:

| RK | CLIENT_ADDR |                     START |
|----|-------------|---------------------------|
|  1 |     1.2.3.4 | January, 01 1970 12:54:06 |
|  1 |     5.6.7.8 | January, 01 1970 11:00:00 |
|  1 |     9.9.9.9 | January, 01 1970 14:00:00 |
|  2 |     1.2.3.4 | January, 01 1970 12:55:00 |
|  2 |     5.6.7.8 | January, 01 1970 12:54:06 |
|  3 |     5.6.7.8 | January, 01 1970 13:00:00 |

ध्यान दें कि यदि आप आईपी पता <कोड> 10.12.13.14 चाहते हैं तो 9.9.9.9 के बाद क्रमबद्ध करने के लिए आपको inet फ़ंक्शन उपयोगकर्ता को रखना होगा <कोड> 1.2.3.4 के बाद (नीचे पहेली देखें)।

पहेली यहां

2
जोड़ा
+1। अभी तक बेहतर: inet डेटा प्रकार से शुरू करने के लिए: तालिका my_table बनाएं (client_addr inet, ...)
जोड़ा लेखक Erwin Brandstetter, स्रोत

AFAIK, एक ही प्रश्न में किया जाना संभव नहीं है, लेकिन विंडो फ़ंक्शन और cte । शायद एक आसान सवाल बनाया जा सकता है, लेकिन यह एक काम करता है।

create table my_table (client_addr varchar, start time);
insert into my_table values ('1.2.3.4', '12:54:06'), ('1.2.3.4','12:55:00'), ('5.6.7.8', '12:54:06'), ('5.6.7.8', '13:00:00'), ('5.6.7.8', '11:00:00'), ('9.9.9.9', '14:00:00');

with t as (select rank() over (partition by client_addr order by start) as RK, client_addr, start from my_table)
select RK, client_addr, start from t order by RK;
0
जोड़ा