PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

एक एसक्यूएल क्वेरी में एकाधिक समय श्रृंखला कैसे उत्पन्न करें?

समाधान 1. समग्र के साथ सरल क्वेरी।

अपेक्षित परिणाम प्राप्त करने का सबसे सरल और तेज़ तरीका। sales को पार्स करना आसान है क्लाइंट प्रोग्राम के भीतर कॉलम।

select item, string_agg(coalesce(sales, 0)::text, ',') sales
from (
    select distinct item_id item, doy
    from generate_series (1, 10) doy  -- change 10 to given n
    cross join entry_daily
    ) sub
left join entry_daily on item_id = item and day_of_year = doy
group by 1
order by 1;

 item |        sales         
------+----------------------
 A1   | 20,0,0,0,0,0,9,0,0,0
 A2   | 11,0,0,0,0,0,0,0,0,0
(2 rows)

समाधान 2. गतिशील रूप से बनाया गया दृश्य।

समाधान 1 के आधार पर array_agg() . के साथ के बजाय string_agg() . फ़ंक्शन दिए गए स्तंभों की संख्या के साथ एक दृश्य बनाता है।

create or replace function create_items_view(view_name text, days int)
returns void language plpgsql as $$
declare
    list text;
begin
    select string_agg(format('s[%s] "%s"', i::text, i::text), ',')
    into list
    from generate_series(1, days) i;

    execute(format($f$
        drop view if exists %s;
        create view %s as select item, %s
        from (
            select item, array_agg(coalesce(sales, 0)) s
            from (
                select distinct item_id item, doy
                from generate_series (1, %s) doy
                cross join entry_daily
                ) sub
            left join entry_daily on item_id = item and day_of_year = doy
            group by 1
            order by 1
        ) q
        $f$, view_name, view_name, list, days)
    );
end $$;

उपयोग:

select create_items_view('items_view_10', 10);

select * from items_view_10;

 item | 1  | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 
------+----+---+---+---+---+---+---+---+---+----
 A1   | 20 | 0 | 0 | 0 | 0 | 0 | 9 | 0 | 0 |  0
 A2   | 11 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |  0
(2 rows)

समाधान 3. क्रॉसटैब।

उपयोग में आसान, लेकिन पंक्ति प्रारूप को परिभाषित करने की आवश्यकता के कारण अधिक संख्या में स्तंभों के साथ बहुत असहज।

create extension if not exists tablefunc;

select * from crosstab (
    'select item_id, day_of_year, sales
    from entry_daily
    order by 1',
    'select i from generate_series (1, 10) i'
) as ct 
(item_id text, "1" int, "2" int, "3" int, "4" int, "5" int, "6" int, "7" int, "8" int, "9" int, "10" int);

 item_id | 1  | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 
---------+----+---+---+---+---+---+---+---+---+----
 A1      | 20 |   |   |   |   |   | 9 |   |   |   
 A2      | 11 |   |   |   |   |   |   |   |   |   
(2 rows)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL सर्वर को चलाए बिना PostgreSQL डेटाबेस को इनिशियलाइज़ कैसे करें

  2. Tablefunc . का उपयोग करके एकाधिक कॉलम पर पिवट करें

  3. INSERT कथन में गतिरोध त्रुटि

  4. चेंजसेट स्कोप को प्रबंधित करने के लिए लिक्विबेस चेंजसेट संदर्भ विशेषता के साथ स्प्रिंग बूट प्रोफाइल का उपयोग करना

  5. PostgreSQL में दोष सहिष्णुता का विकास:समय यात्रा