{"id":118010,"date":"2026-10-26T03:24:32","date_gmt":"2026-10-25T19:24:32","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/118010.html"},"modified":"2026-10-26T03:24:32","modified_gmt":"2026-10-25T19:24:32","slug":"sql-sql-aggregate-functions-and-grouping-sets-using-postgresql-18","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/118010.html","title":{"rendered":"sql: SQL Aggregate Functions and Grouping Sets using PostgreSQL 18"},"content":{"rendered":"<\/p>\n<p>&#8212; &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n&#8212; PostgreSQL 18 \u2014 SQL \u805a\u5408\u51fd\u6570\u4e0e\u5206\u7ec4\u96c6 (Aggregate Functions &amp; Grouping Sets)<br \/>\n&#8212; \u573a\u666f: \u4e07\u4ebf\u6570\u636e\u9ad8\u5e76\u53d1 \/ \u56fd\u9645\u65f6\u533a\u65f6\u95f4\u5dee \/ \u56fd\u9645\u591a\u79cd\u8d27\u5e01\u7ed3\u7b97<br \/>\n&#8212; \u672c\u6587\u4ef6\u3010\u81ea\u5305\u542b\u00b7\u5b8c\u5168\u5e42\u7b49\u3011: \u91cd\u590d\u8fd0\u884c\u7ed3\u679c\u9010\u5b57\u8282\u4e00\u81f4 (setseed \u4fdd\u8bc1\u9020\u6570\u4e00\u81f4)<br \/>\n&#8212; \u8fde\u63a5\u65b9\u5f0f: PGPASSWORD&#061;&lt;your_password&gt; psql -U postgres -h localhost -p 5433 -d jewelry_pg -f \u672c\u6587\u4ef6<br \/>\n&#8212; &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/p>\n<p>\\\\timing off<br \/>\nSET client_min_messages &#061; warning;         &#8212; \u6291\u5236 DROP\/CREATE\/VACUUM \u7684 NOTICE, \u4fdd\u8bc1\u91cd\u8dd1\u5e42\u7b49<br \/>\nSET max_parallel_workers_per_gather &#061; 0;   &#8212; \u5173\u5e76\u884c, \u4f7f\u5757\u7edf\u8ba1\u7a33\u5b9a(\u4e07\u4ebf\u7ea7\u53ef\u636e\u9700\u5f00\u542f)<br \/>\nSET random_page_cost &#061; 1.1;<br \/>\nSET seq_page_cost &#061; 1.0;<br \/>\nSET effective_cache_size &#061; &#039;4GB&#039;;<\/p>\n<p>&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n&#8212; 0. \u5ea6\u91cf\u6846\u67b6 (DROP &#043; CREATE, \u5e42\u7b49)<br \/>\n&#8212;    pg_plan_stats: \u6293\u771f\u5b9e\u6267\u884c\u8ba1\u5212 (Actual Rows \/ \u5171\u4eab\u5757 \/ \u626b\u63cf\u8282\u70b9\u7c7b\u578b)<br \/>\n&#8212;    pg_find_scan : \u4e0b\u94bb\u5230\u771f\u6b63\u7684\u626b\u63cf\u8282\u70b9 (\u9876\u5c42\u5e38\u662f Aggregate\/Finalize Aggregate)<br \/>\n&#8212;    pg_demo_v    : \u81ea\u68c0\u767b\u8bb0<br \/>\n&#8212;    pg_demo_err_probe : \u6355\u83b7\u771f\u5b9e\u62a5\u9519<br \/>\n&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\nDROP FUNCTION IF EXISTS pg_plan_stats(text) CASCADE;<br \/>\nCREATE OR REPLACE FUNCTION pg_plan_stats(<br \/>\n  p_sql text,<br \/>\n  OUT actual_rows bigint,<br \/>\n  OUT shared_blks bigint,<br \/>\n  OUT node_type   text)<br \/>\nRETURNS record LANGUAGE plpgsql AS $$<br \/>\nDECLARE j json;<br \/>\nBEGIN<br \/>\n  EXECUTE &#039;EXPLAIN (ANALYZE, TIMING OFF, FORMAT JSON) &#039; || p_sql INTO j;<br \/>\n  actual_rows :&#061; (j-&gt;0-&gt;&#039;Plan&#039;-&gt;&gt;&#039;Actual Rows&#039;)::numeric::bigint;<br \/>\n  shared_blks :&#061; COALESCE((j-&gt;0-&gt;&#039;Plan&#039;-&gt;&gt;&#039;Shared Hit Blocks&#039;)::numeric::bigint,0)<br \/>\n              &#043; COALESCE((j-&gt;0-&gt;&#039;Plan&#039;-&gt;&gt;&#039;Shared Read Blocks&#039;)::numeric::bigint,0);<br \/>\n  node_type   :&#061; pg_find_scan(j-&gt;0-&gt;&#039;Plan&#039;);<br \/>\nEND $$;<\/p>\n<p>DROP FUNCTION IF EXISTS pg_find_scan(json) CASCADE;<br \/>\nCREATE OR REPLACE FUNCTION pg_find_scan(cur json) RETURNS text LANGUAGE plpgsql AS $$<br \/>\nDECLARE nt text;<br \/>\nBEGIN<br \/>\n  nt :&#061; cur-&gt;&gt;&#039;Node Type&#039;;<br \/>\n  IF nt LIKE &#039;%Scan&#039; THEN RETURN nt; END IF;<br \/>\n  IF cur-&gt;&#039;Plans&#039; IS NOT NULL AND json_array_length(cur-&gt;&#039;Plans&#039;) &gt; 0 THEN<br \/>\n    RETURN pg_find_scan(cur-&gt;&#039;Plans&#039;-&gt;0);<br \/>\n  END IF;<br \/>\n  RETURN nt;<br \/>\nEND $$;<\/p>\n<p>DROP TABLE IF EXISTS pg_demo_check;<br \/>\nCREATE TABLE pg_demo_check (<br \/>\n  name   text PRIMARY KEY,<br \/>\n  pass   int,<br \/>\n  detail text<br \/>\n);<br \/>\nDROP FUNCTION IF EXISTS pg_demo_v(text,int,text) CASCADE;<br \/>\nCREATE OR REPLACE FUNCTION pg_demo_v(p_name text, p_pass int, p_detail text)<br \/>\nRETURNS void LANGUAGE plpgsql AS $$<br \/>\nBEGIN<br \/>\n  INSERT INTO pg_demo_check(name,pass,detail) VALUES (p_name,p_pass,p_detail)<br \/>\n  ON CONFLICT (name) DO UPDATE SET pass&#061;EXCLUDED.pass, detail&#061;EXCLUDED.detail;<br \/>\nEND $$;<\/p>\n<p>DROP TABLE IF EXISTS pg_demo_probe;<br \/>\nCREATE TABLE pg_demo_probe (<br \/>\n  label    text PRIMARY KEY,<br \/>\n  sqlstate text,<br \/>\n  msg      text<br \/>\n);<br \/>\nDROP FUNCTION IF EXISTS pg_demo_err_probe(text,text) CASCADE;<br \/>\nCREATE OR REPLACE FUNCTION pg_demo_err_probe(p_label text, p_sql text)<br \/>\nRETURNS void LANGUAGE plpgsql AS $$<br \/>\nDECLARE e text; s text;<br \/>\nBEGIN<br \/>\n  BEGIN<br \/>\n    EXECUTE p_sql;<br \/>\n    INSERT INTO pg_demo_probe(label,sqlstate,msg) VALUES (p_label,&#039;OK&#039;,&#039;\u6267\u884c\u6210\u529f&#039;)<br \/>\n    ON CONFLICT (label) DO UPDATE SET sqlstate&#061;&#039;OK&#039;, msg&#061;&#039;\u6267\u884c\u6210\u529f&#039;;<br \/>\n  EXCEPTION WHEN OTHERS THEN<br \/>\n    GET STACKED DIAGNOSTICS s&#061;RETURNED_SQLSTATE, e&#061;MESSAGE_TEXT;<br \/>\n    INSERT INTO pg_demo_probe(label,sqlstate,msg) VALUES (p_label,s,e)<br \/>\n    ON CONFLICT (label) DO UPDATE SET sqlstate&#061;EXCLUDED.sqlstate, msg&#061;EXCLUDED.msg;<br \/>\n  END;<br \/>\nEND $$;<\/p>\n<p>&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n&#8212; 1. \u7ef4\u5ea6\u8868 (\u516b\u57df\u4e2d\u53f0\u914d\u5957\u7ef4\u5ea6) \u2014\u2014 DROP &#043; CREATE \u4fdd\u8bc1\u5e42\u7b49<br \/>\n&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\nDROP TABLE IF EXISTS pg_txn CASCADE;<br \/>\nDROP TABLE IF EXISTS pg_customer CASCADE;<br \/>\nDROP TABLE IF EXISTS pg_product CASCADE;<br \/>\nDROP TABLE IF EXISTS pg_supplier CASCADE;<br \/>\nDROP TABLE IF EXISTS pg_warehouse CASCADE;<br \/>\nDROP TABLE IF EXISTS pg_employee CASCADE;<\/p>\n<p>&#8212; \u7ef4\u5ea6: \u5ba2\u6237 (\u542b\u65f6\u533a \/ VIP \u7b49\u7ea7)<br \/>\nCREATE TABLE pg_customer (<br \/>\n  customer_id int PRIMARY KEY,<br \/>\n  cust_name   text,<br \/>\n  country_code text,<br \/>\n  tz          text,<br \/>\n  vip_level   int,<br \/>\n  email       text<br \/>\n);<br \/>\nINSERT INTO pg_customer<br \/>\nSELECT n,<br \/>\n       (ARRAY[&#039;Acme&#039;,&#039;Globex&#039;,&#039;Initech&#039;,&#039;Umbrella&#039;,&#039;Soylent&#039;,&#039;Hooli&#039;,&#039;Stark&#039;,&#039;Wayne&#039;,&#039;Wonka&#039;,&#039;Cyberdyne&#039;])[1&#043;(n%10)] || &#039; &#039; || chr(65&#043;(n%26)) || n,<br \/>\n       (ARRAY[&#039;CN&#039;,&#039;HK&#039;,&#039;US&#039;,&#039;JP&#039;,&#039;DE&#039;,&#039;FR&#039;,&#039;GB&#039;,&#039;SG&#039;,&#039;AU&#039;,&#039;IN&#039;])[1&#043;(n%10)],<br \/>\n       (ARRAY[&#039;Asia\/Shanghai&#039;,&#039;Asia\/Hong_Kong&#039;,&#039;America\/New_York&#039;,&#039;Asia\/Tokyo&#039;,&#039;Europe\/Berlin&#039;,&#039;Europe\/Paris&#039;,&#039;Europe\/London&#039;,&#039;Asia\/Singapore&#039;,&#039;Australia\/Sydney&#039;,&#039;Asia\/Kolkata&#039;])[1&#043;(n%10)],<br \/>\n       1&#043;(n%5),<br \/>\n       &#039;cust&#039;||n||&#039;&#064;example.com&#039;<br \/>\nFROM generate_series(1,10000) n;<\/p>\n<p>&#8212; \u7ef4\u5ea6: \u5546\u54c1 KMS (\u591a\u8bed\u8a00\u540d\u79f0\/\u63cf\u8ff0 &#043; jsonb \u89c4\u683c &#043; \u751f\u6210\u5f0f tsvector)<br \/>\nCREATE TABLE pg_product (<br \/>\n  product_id int PRIMARY KEY,<br \/>\n  sku        text,<br \/>\n  name_en    text,<br \/>\n  name_cn    text,<br \/>\n  desc_en    text,<br \/>\n  desc_cn    text,<br \/>\n  specs      jsonb,<br \/>\n  search_vec tsvector GENERATED ALWAYS AS (<br \/>\n    to_tsvector(&#039;english&#039;, coalesce(desc_en,&#039;&#039;)||&#039; &#039;||coalesce(name_en,&#039;&#039;))) STORED<br \/>\n);<br \/>\nINSERT INTO pg_product (product_id, sku, name_en, name_cn, desc_en, desc_cn, specs)<br \/>\nSELECT n,<br \/>\n       &#039;SKU-&#039;||lpad(n::text,6,&#039;0&#039;),<br \/>\n       (ARRAY[&#039;Diamond Ring&#039;,&#039;Gold Necklace&#039;,&#039;Pearl Earring&#039;,&#039;Ruby Bracelet&#039;,&#039;Sapphire Pendant&#039;,&#039;Emerald Brooch&#039;,&#039;Platinum Band&#039;,&#039;Tanzanite Ring&#039;,&#039;Jade Pendant&#039;,&#039;Onyx Cufflink&#039;])[1&#043;(n%10)] || &#039; &#039; || n,<br \/>\n       &#039;\u73e0\u5b9d&#039;||n,<br \/>\n       &#039;A fine &#039;||(ARRAY[&#039;diamond&#039;,&#039;gold&#039;,&#039;pearl&#039;,&#039;ruby&#039;,&#039;sapphire&#039;,&#039;emerald&#039;,&#039;platinum&#039;,&#039;tanzanite&#039;,&#039;jade&#039;,&#039;onyx&#039;])[1&#043;(n%10)]||&#039; piece crafted for global markets.&#039;,<br \/>\n       &#039;\u7cbe\u81f4&#039;||(ARRAY[&#039;\u94bb\u77f3&#039;,&#039;\u9ec4\u91d1&#039;,&#039;\u73cd\u73e0&#039;,&#039;\u7ea2\u5b9d\u77f3&#039;,&#039;\u84dd\u5b9d\u77f3&#039;,&#039;\u7956\u6bcd\u7eff&#039;,&#039;\u94c2\u91d1&#039;,&#039;\u5766\u6851\u77f3&#039;,&#039;\u7fe1\u7fe0&#039;,&#039;\u7f1f\u739b\u7459&#039;])[1&#043;(n%10)]||&#039;\u9970\u54c1\u3002&#039;,<br \/>\n       jsonb_build_object(&#039;carat&#039;, round((0.5&#043;(n%50)\/10.0)::numeric,2),<br \/>\n                          &#039;color&#039;, (ARRAY[&#039;D&#039;,&#039;E&#039;,&#039;F&#039;,&#039;G&#039;,&#039;H&#039;])[1&#043;(n%5)],<br \/>\n                          &#039;clarity&#039;,(ARRAY[&#039;VVS1&#039;,&#039;VVS2&#039;,&#039;VS1&#039;,&#039;VS2&#039;,&#039;SI1&#039;])[1&#043;(n%5)])<br \/>\nFROM generate_series(1,2000) n;<\/p>\n<p>&#8212; \u7ef4\u5ea6: \u4f9b\u5e94\u5546 \/ \u4ed3\u5e93 \/ \u5458\u5de5<br \/>\nCREATE TABLE pg_supplier (supplier_id int PRIMARY KEY, supplier_name text, country_code text);<br \/>\nINSERT INTO pg_supplier<br \/>\nSELECT n, &#039;Supplier-&#039;||n, (ARRAY[&#039;CN&#039;,&#039;HK&#039;,&#039;US&#039;,&#039;JP&#039;,&#039;DE&#039;,&#039;FR&#039;,&#039;GB&#039;,&#039;SG&#039;,&#039;AU&#039;,&#039;IN&#039;])[1&#043;(n%10)]<br \/>\nFROM generate_series(1,200) n;<\/p>\n<p>CREATE TABLE pg_warehouse (warehouse_id int PRIMARY KEY, warehouse_name text, country_code text);<br \/>\nINSERT INTO pg_warehouse<br \/>\nSELECT n, &#039;WH-&#039;||n, (ARRAY[&#039;CN&#039;,&#039;HK&#039;,&#039;US&#039;,&#039;JP&#039;,&#039;DE&#039;,&#039;FR&#039;,&#039;GB&#039;,&#039;SG&#039;,&#039;AU&#039;,&#039;IN&#039;])[1&#043;(n%10)]<br \/>\nFROM generate_series(1,50) n;<\/p>\n<p>CREATE TABLE pg_employee (emp_id int PRIMARY KEY, emp_name text, dept text, country_code text);<br \/>\nINSERT INTO pg_employee<br \/>\nSELECT n, &#039;Emp-&#039;||n, (ARRAY[&#039;OA&#039;,&#039;ERP&#039;,&#039;CRM&#039;,&#039;HRM&#039;,&#039;MES&#039;,&#039;SCM&#039;,&#039;WMS&#039;,&#039;KMS&#039;])[1&#043;(n%8)],<br \/>\n       (ARRAY[&#039;CN&#039;,&#039;HK&#039;,&#039;US&#039;,&#039;JP&#039;,&#039;DE&#039;,&#039;FR&#039;,&#039;GB&#039;,&#039;SG&#039;,&#039;AU&#039;,&#039;IN&#039;])[1&#043;(n%10)]<br \/>\nFROM generate_series(1,500) n;<\/p>\n<p>&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n&#8212; 2. \u4e8b\u5b9e\u8868 pg_txn (10 \u4e07\u884c\u4ea4\u6613, \u516b\u57df &#043; \u65f6\u533a\u751f\u6210\u5217 &#043; \u672c\u5730\u65e5\u751f\u6210\u5217 &#043; \u591a\u5e01\u79cd)<br \/>\n&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\nCREATE TABLE pg_txn (<br \/>\n  txn_id        bigint PRIMARY KEY,<br \/>\n  system_code   text NOT NULL,<br \/>\n  customer_id   int,<br \/>\n  product_id    int,<br \/>\n  supplier_id   int,<br \/>\n  warehouse_id  int,<br \/>\n  emp_id        int,<br \/>\n  country_code  text,<br \/>\n  currency_code text,<br \/>\n  amount_orig   numeric(14,2),<br \/>\n  amount_usd    numeric(14,4),<br \/>\n  created_utc   timestamptz,<br \/>\n  tz            text GENERATED ALWAYS AS (<br \/>\n                   CASE country_code<br \/>\n                     WHEN &#039;CN&#039; THEN &#039;Asia\/Shanghai&#039; WHEN &#039;HK&#039; THEN &#039;Asia\/Hong_Kong&#039;<br \/>\n                     WHEN &#039;US&#039; THEN &#039;America\/New_York&#039; WHEN &#039;JP&#039; THEN &#039;Asia\/Tokyo&#039;<br \/>\n                     WHEN &#039;DE&#039; THEN &#039;Europe\/Berlin&#039; WHEN &#039;FR&#039; THEN &#039;Europe\/Paris&#039;<br \/>\n                     WHEN &#039;GB&#039; THEN &#039;Europe\/London&#039; WHEN &#039;SG&#039; THEN &#039;Asia\/Singapore&#039;<br \/>\n                     WHEN &#039;AU&#039; THEN &#039;Australia\/Sydney&#039; WHEN &#039;IN&#039; THEN &#039;Asia\/Kolkata&#039;<br \/>\n                     ELSE &#039;UTC&#039; END) STORED,<br \/>\n  create_local_date date GENERATED ALWAYS AS (<br \/>\n                   (created_utc AT TIME ZONE (<br \/>\n                     CASE country_code<br \/>\n                       WHEN &#039;CN&#039; THEN &#039;Asia\/Shanghai&#039; WHEN &#039;HK&#039; THEN &#039;Asia\/Hong_Kong&#039;<br \/>\n                       WHEN &#039;US&#039; THEN &#039;America\/New_York&#039; WHEN &#039;JP&#039; THEN &#039;Asia\/Tokyo&#039;<br \/>\n                       WHEN &#039;DE&#039; THEN &#039;Europe\/Berlin&#039; WHEN &#039;FR&#039; THEN &#039;Europe\/Paris&#039;<br \/>\n                       WHEN &#039;GB&#039; THEN &#039;Europe\/London&#039; WHEN &#039;SG&#039; THEN &#039;Asia\/Singapore&#039;<br \/>\n                       WHEN &#039;AU&#039; THEN &#039;Australia\/Sydney&#039; WHEN &#039;IN&#039; THEN &#039;Asia\/Kolkata&#039;<br \/>\n                       ELSE &#039;UTC&#039; END))::date) STORED,<br \/>\n  reference_no  text UNIQUE,<br \/>\n  note          text,<br \/>\n  rand_val      double precision<br \/>\n);<\/p>\n<p>&#8212; \u9020\u6570: setseed \u4fdd\u8bc1\u6bcf\u6b21\u8fd0\u884c\u6570\u636e\u5b8c\u5168\u4e00\u81f4 -&gt; \u5e42\u7b49<br \/>\nDO $$<br \/>\nBEGIN<br \/>\n  PERFORM setseed(0.20261018);<br \/>\n  INSERT INTO pg_txn (txn_id, system_code, customer_id, product_id, supplier_id, warehouse_id,<br \/>\n                      emp_id, country_code, currency_code, amount_orig, amount_usd,<br \/>\n                      created_utc, reference_no, note, rand_val)<br \/>\n  SELECT n,<br \/>\n         (ARRAY[&#039;OA&#039;,&#039;ERP&#039;,&#039;CRM&#039;,&#039;HRM&#039;,&#039;MES&#039;,&#039;SCM&#039;,&#039;WMS&#039;,&#039;KMS&#039;])[1&#043;(n%8)],<br \/>\n         1&#043;((n&#043;n\/8)%10000),                       &#8212; \u5ba2\u6237: \u89e3\u8026 note \u7684 n%12, \u907f\u514d\u8de8\u57df\u6a21\u8026\u5408<br \/>\n         1&#043;(n%2000),<br \/>\n         1&#043;(n%200),<br \/>\n         1&#043;(n%50),<br \/>\n         1&#043;(n%500),<br \/>\n         (ARRAY[&#039;CN&#039;,&#039;HK&#039;,&#039;US&#039;,&#039;JP&#039;,&#039;DE&#039;,&#039;FR&#039;,&#039;GB&#039;,&#039;SG&#039;,&#039;AU&#039;,&#039;IN&#039;])[1&#043;((n\/8)%10)],<br \/>\n         (ARRAY[&#039;CNY&#039;,&#039;HKD&#039;,&#039;USD&#039;,&#039;JPY&#039;,&#039;EUR&#039;,&#039;EUR&#039;,&#039;GBP&#039;,&#039;SGD&#039;,&#039;AUD&#039;,&#039;INR&#039;])[1&#043;((n\/8)%10)],<br \/>\n         round((100 &#043; random()*90000)::numeric,2),<br \/>\n         round(((100 &#043; random()*90000) \/<br \/>\n           (CASE (ARRAY[&#039;CNY&#039;,&#039;HKD&#039;,&#039;USD&#039;,&#039;JPY&#039;,&#039;EUR&#039;,&#039;EUR&#039;,&#039;GBP&#039;,&#039;SGD&#039;,&#039;AUD&#039;,&#039;INR&#039;])[1&#043;(n%10)]<br \/>\n             WHEN &#039;CNY&#039; THEN 7.10 WHEN &#039;HKD&#039; THEN 7.80 WHEN &#039;USD&#039; THEN 1.00<br \/>\n             WHEN &#039;JPY&#039; THEN 150.0 WHEN &#039;EUR&#039; THEN 0.92 WHEN &#039;GBP&#039; THEN 0.79<br \/>\n             WHEN &#039;SGD&#039; THEN 1.35 WHEN &#039;AUD&#039; THEN 1.52 WHEN &#039;INR&#039; THEN 83.0 END))::numeric,4),<br \/>\n         &#039;2025-01-01 00:00:00&#043;00&#039;::timestamptz &#043; ((random()*300*24*3600)::integer * interval &#039;1 second&#039;),<br \/>\n         &#039;REF-&#039;||lpad(n::text,8,&#039;0&#039;),<br \/>\n         (ARRAY[&#039;Diamond&#039;,&#039;Gold&#039;,&#039;Pearl&#039;,&#039;Ruby&#039;,&#039;Sapphire&#039;,&#039;Emerald&#039;,&#039;Platinum&#039;,&#039;Tanzanite&#039;,&#039;Jade&#039;,&#039;Onyx&#039;,&#039;Zirconia&#039;,&#039;Topaz&#039;])[1&#043;(n%12)] || &#039; order for VIP client&#039;,<br \/>\n         random()<br \/>\n  FROM generate_series(1,100000) n;<br \/>\nEND $$;<\/p>\n<p>&#8212; \u7d22\u5f15 (\u8986\u76d6\u7d22\u5f15\u7528\u4e8e\u514d\u56de\u8868\u805a\u5408)<br \/>\nCREATE INDEX idx_txn_cover     ON pg_txn (system_code, amount_usd);<br \/>\nCREATE INDEX idx_txn_created   ON pg_txn (created_utc);<br \/>\nCREATE INDEX idx_txn_localday  ON pg_txn (create_local_date);<br \/>\nCREATE INDEX idx_txn_cust      ON pg_txn (customer_id);<br \/>\nCREATE INDEX idx_txn_sys_ctry  ON pg_txn (system_code, country_code);<br \/>\nCREATE INDEX brin_txn_created  ON pg_txn USING brin (created_utc);<\/p>\n<p>VACUUM ANALYZE pg_txn;   &#8212; \u4f7f\u8986\u76d6\u7d22\u5f15 Index Only Scan \u771f\u6b63\u514d\u56de\u8868<\/p>\n<p>&#8212; &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n&#8212; \u00a71. \u57fa\u672c\u805a\u5408\u51fd\u6570 (COUNT \/ SUM \/ AVG \/ MIN \/ MAX) \u2014\u2014 \u5355\u57df GMV \u770b\u677f<br \/>\n&#8212; &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n\\\\echo &#039;&#061;&#061;&#061; \u00a71 \u57fa\u672c\u805a\u5408: ERP \u57df GMV \u770b\u677f &#061;&#061;&#061;&#039;<br \/>\nSELECT system_code,<br \/>\n       count(*)                              AS txn_cnt,<br \/>\n       round(sum(amount_usd),2)             AS gmv_usd,<br \/>\n       round(avg(amount_usd),2)             AS avg_usd,<br \/>\n       round(min(amount_usd),2)             AS min_usd,<br \/>\n       round(max(amount_usd),2)             AS max_usd<br \/>\nFROM pg_txn<br \/>\nWHERE system_code &#061; &#039;ERP&#039;<br \/>\nGROUP BY system_code;<\/p>\n<p>&#8212; &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n&#8212; \u00a72. \u591a\u5217 GROUP BY \u2014\u2014 \u516b\u57df \u00d7 \u5341\u56fd \u4ea4\u53c9\u6c47\u603b<br \/>\n&#8212; &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n\\\\echo &#039;&#061;&#061;&#061; \u00a72 \u591a\u5217 GROUP BY: \u57df \u00d7 \u56fd\u5bb6 GMV (\u53d6\u524d 12 \u884c) &#061;&#061;&#061;&#039;<br \/>\nSELECT system_code, country_code,<br \/>\n       count(*) AS txn_cnt,<br \/>\n       round(sum(amount_usd),2) AS gmv_usd<br \/>\nFROM pg_txn<br \/>\nGROUP BY system_code, country_code<br \/>\nORDER BY gmv_usd DESC<br \/>\nLIMIT 12;<\/p>\n<p>&#8212; &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n&#8212; \u00a73. HAVING \u2014\u2014 \u8fc7\u6ee4\u805a\u5408\u7ed3\u679c (GMV \u8d85\u8fc7\u95e8\u69db\u7684 \u57df\u00d7\u56fd\u5bb6 \u7ec4\u5408)<br \/>\n&#8212; &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n\\\\echo &#039;&#061;&#061;&#061; \u00a73 HAVING: \u4ec5\u4fdd\u7559 GMV &gt; 1,000,000 \u7684 \u57df\u00d7\u56fd\u5bb6 \u7ec4\u5408 &#061;&#061;&#061;&#039;<br \/>\nSELECT system_code, country_code,<br \/>\n       count(*) AS txn_cnt,<br \/>\n       round(sum(amount_usd),2) AS gmv_usd<br \/>\nFROM pg_txn<br \/>\nGROUP BY system_code, country_code<br \/>\nHAVING sum(amount_usd) &gt; 1000000<br \/>\nORDER BY gmv_usd DESC<br \/>\nLIMIT 12;<\/p>\n<p>&#8212; &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n&#8212; \u00a74. \u56fd\u9645\u65f6\u533a\u805a\u5408 \u2014\u2014 \u540c\u4e00\u7b14 UTC \u4ea4\u6613\u6309\u672c\u5730\u65e5\u5f52\u5c5e\u53ef\u80fd\u4e0d\u540c\u5929<br \/>\n&#8212; &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n\\\\echo &#039;&#061;&#061;&#061; \u00a74 \u65f6\u533a\u805a\u5408: \u4e2d\u56fd(CN) \u6309 UTC \u65e5 vs \u4e0a\u6d77\u672c\u5730\u65e5 \u7684\u6bcf\u65e5\u7b14\u6570\u5206\u5e03(\u5404\u53d6\u524d 5) &#061;&#061;&#061;&#039;<br \/>\n\\\\echo &#039;&#8212; 4a UTC \u65e5 &#8212;&#039;<br \/>\nSELECT (created_utc AT TIME ZONE &#039;UTC&#039;)::date AS utc_day, count(*) AS cnt<br \/>\nFROM pg_txn WHERE country_code&#061;&#039;CN&#039; GROUP BY 1 ORDER BY 1 LIMIT 5;<br \/>\n\\\\echo &#039;&#8212; 4b \u4e0a\u6d77\u672c\u5730\u65e5 (\u751f\u6210\u5217 create_local_date) &#8212;&#039;<br \/>\nSELECT create_local_date AS shanghai_day, count(*) AS cnt<br \/>\nFROM pg_txn WHERE country_code&#061;&#039;CN&#039; GROUP BY 1 ORDER BY 1 LIMIT 5;<\/p>\n<p>&#8212; &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n&#8212; \u00a75. \u56fd\u9645\u591a\u5e01\u79cd\u7ed3\u7b97\u53e3\u5f84 \u2014\u2014 \u539f\u5e01\u6df7\u52a0\u65e0\u610f\u4e49, \u987b\u7edf\u4e00 amount_usd<br \/>\n&#8212; &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n\\\\echo &#039;&#061;&#061;&#061; \u00a75 \u591a\u5e01\u79cd: \u6309\u539f\u5e01\u5206\u7ec4\u6c47\u603b vs \u7edf\u4e00\u7f8e\u5143\u53e3\u5f84 &#061;&#061;&#061;&#039;<br \/>\nSELECT currency_code,<br \/>\n       round(sum(amount_orig),2) AS gmv_orig,<br \/>\n       round(sum(amount_usd),2)  AS gmv_usd<br \/>\nFROM pg_txn<br \/>\nGROUP BY currency_code<br \/>\nORDER BY gmv_usd DESC;<\/p>\n<p>&#8212; &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n&#8212; \u00a76. \u7edf\u8ba1\u5206\u5e03\u805a\u5408 \u2014\u2014 \u5206\u4f4d\u6570 \/ \u4f17\u6570 \/ \u5b57\u7b26\u4e32\u805a\u5408<br \/>\n&#8212; &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n\\\\echo &#039;&#061;&#061;&#061; \u00a76a \u5206\u4f4d\u6570: \u5355\u7b14\u7f8e\u5143\u91d1\u989d \u4e2d\u4f4d\u6570 &amp; 90 \u5206\u4f4d &#061;&#061;&#061;&#039;<br \/>\nSELECT round(percentile_cont(0.5) WITHIN GROUP (ORDER BY amount_usd)::numeric,2) AS median_usd,<br \/>\n       round(percentile_cont(0.9) WITHIN GROUP (ORDER BY amount_usd)::numeric,2) AS p90_usd,<br \/>\n       round(percentile_disc(0.9) WITHIN GROUP (ORDER BY amount_usd)::numeric,2) AS p90_disc_usd<br \/>\nFROM pg_txn;<\/p>\n<p>\\\\echo &#039;&#061;&#061;&#061; \u00a76b \u4f17\u6570: \u6700\u9891\u7e41\u7ed3\u7b97\u8d27\u5e01 &#061;&#061;&#061;&#039;<br \/>\nSELECT mode() WITHIN GROUP (ORDER BY currency_code) AS top_currency,<br \/>\n       count(*) FILTER (WHERE true) AS total<br \/>\nFROM pg_txn;<\/p>\n<p>\\\\echo &#039;&#061;&#061;&#061; \u00a76c \u5b57\u7b26\u4e32\u805a\u5408: \u5ba2\u6237 #1 \u7684\u8ba2\u5355\u53f7\u6e05\u5355 (\u524d 60 \u5b57\u7b26) &#061;&#061;&#061;&#039;<br \/>\nSELECT left(string_agg(reference_no, &#039;, &#039; ORDER BY txn_id), 60) AS order_list<br \/>\nFROM pg_txn WHERE customer_id &#061; 1;<\/p>\n<p>&#8212; &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n&#8212; \u00a77. \u5206\u7ec4\u96c6: GROUPING SETS \/ ROLLUP \/ CUBE &#043; GROUPING() \u6807\u8bb0\u5c0f\u8ba1<br \/>\n&#8212; &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n\\\\echo &#039;&#061;&#061;&#061; \u00a77a GROUPING SETS: \u540c\u65f6\u5f97 (\u57df)\/(\u56fd\u5bb6)\/(\u57df,\u56fd\u5bb6)\/(\u603b\u8ba1) \u56db\u79cd\u7c92\u5ea6 &#061;&#061;&#061;&#039;<br \/>\nSELECT system_code, country_code,<br \/>\n       GROUPING(system_code)   AS g_sys,<br \/>\n       GROUPING(country_code)  AS g_ctry,<br \/>\n       count(*)                AS txn_cnt,<br \/>\n       round(sum(amount_usd),2) AS gmv_usd<br \/>\nFROM pg_txn<br \/>\nGROUP BY GROUPING SETS ((system_code),(country_code),(system_code,country_code),())<br \/>\nORDER BY g_sys, g_ctry, system_code, country_code;<\/p>\n<p>\\\\echo &#039;&#061;&#061;&#061; \u00a77b ROLLUP(\u56fd\u5bb6,\u57df): \u5c42\u7ea7\u5c0f\u8ba1 (\u56fd\u5bb6,\u57df)-&gt;(\u56fd\u5bb6)-&gt;(\u603b\u8ba1) &#061;&#061;&#061;&#039;<br \/>\nSELECT country_code, system_code,<br \/>\n       GROUPING(country_code) AS g_c, GROUPING(system_code) AS g_s,<br \/>\n       count(*) AS txn_cnt<br \/>\nFROM pg_txn<br \/>\nGROUP BY ROLLUP (country_code, system_code)<br \/>\nORDER BY g_c, g_s, country_code, system_code;<\/p>\n<p>\\\\echo &#039;&#061;&#061;&#061; \u00a77c CUBE(\u56fd\u5bb6,\u57df): \u7acb\u65b9\u4f53 (\u542b \u57df \u5355\u72ec\u5c0f\u8ba1) &#061;&#061;&#061;&#039;<br \/>\nSELECT country_code, system_code,<br \/>\n       GROUPING(country_code) AS g_c, GROUPING(system_code) AS g_s,<br \/>\n       count(*) AS txn_cnt<br \/>\nFROM pg_txn<br \/>\nGROUP BY CUBE (country_code, system_code)<br \/>\nORDER BY g_c, g_s, country_code, system_code;<\/p>\n<p>&#8212; &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n&#8212; \u00a78. \u4e07\u4ebf\u7ea7\u9884\u6f14 \u2014\u2014 \u7269\u5316\u89c6\u56fe\u9884\u805a\u5408 (\u907f\u514d\u6bcf\u6b21\u5168\u8868\u626b\u63cf)<br \/>\n&#8212; &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\nDROP MATERIALIZED VIEW IF EXISTS mv_gmv CASCADE;<br \/>\nCREATE MATERIALIZED VIEW mv_gmv AS<br \/>\n  SELECT system_code, country_code, create_local_date,<br \/>\n         SUM(amount_usd) gmv_usd, COUNT(*) cnt<br \/>\n  FROM pg_txn<br \/>\n  GROUP BY system_code, country_code, create_local_date;<br \/>\nREFRESH MATERIALIZED VIEW mv_gmv;<\/p>\n<p>\\\\echo &#039;&#061;&#061;&#061; \u00a78 \u7269\u5316\u89c6\u56fe\u9884\u805a\u5408: \u6309\u672c\u5730\u65e5\u00d7\u57df\u00d7\u56fd\u5bb6 \u7684 GMV (\u524d 5) &#061;&#061;&#061;&#039;<br \/>\nSELECT system_code, country_code, create_local_date,<br \/>\n       round(gmv_usd,2) AS gmv_usd, cnt<br \/>\nFROM mv_gmv ORDER BY gmv_usd DESC LIMIT 5;<\/p>\n<p>&#8212; &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n&#8212; V1\u2013V18 \u81ea\u68c0 (\u5168\u90e8\u5305\u8fdb DO $$ \u5757; PG \u65e0\u4f1a\u8bdd\u53d8\u91cf, \u7528 SELECT INTO)<br \/>\n&#8212; &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n\\\\echo &#039;&#061;&#061;&#061; SELF-CHECK V1..V18 &#061;&#061;&#061;&#039;<\/p>\n<p>&#8212; V1: \u57fa\u672c\u805a\u5408 (\u5355\u57df ERP \u8ba1\u6570\u7ea6 1.25 \u4e07, \u6c47\u603b &gt; 0, \u987a\u5e8f\u6b63\u786e)<br \/>\nDO $$<br \/>\nDECLARE cnt bigint; sm numeric; av numeric; mn numeric; mx numeric;<br \/>\nBEGIN<br \/>\n  SELECT count(*), sum(amount_usd), avg(amount_usd), min(amount_usd), max(amount_usd)<br \/>\n    INTO cnt, sm, av, mn, mx FROM pg_txn WHERE system_code&#061;&#039;ERP&#039;;<br \/>\n  PERFORM pg_demo_v(&#039;V1_basic_aggregate&#039;,<br \/>\n    CASE WHEN cnt BETWEEN 12000 AND 13000 AND sm&gt;0 AND av&gt;&#061;mn AND mx&gt;&#061;av THEN 1 ELSE 0 END,<br \/>\n    &#039;erp_cnt&#061;&#039;||cnt||&#039; sum_usd&#061;&#039;||round(sm,2)||&#039; avg&#061;&#039;||round(av,2)||&#039; min&#061;&#039;||mn||&#039; max&#061;&#039;||mx);<br \/>\nEND $$;<\/p>\n<p>&#8212; V2: \u591a\u5217 GROUP BY \u884c\u6570 &#061; 8 \u57df \u00d7 10 \u56fd &#061; 80<br \/>\nDO $$<br \/>\nDECLARE n int;<br \/>\nBEGIN<br \/>\n  SELECT count(*) INTO n FROM (SELECT 1 FROM pg_txn GROUP BY system_code, country_code) z;<br \/>\n  PERFORM pg_demo_v(&#039;V2_multicol_groupby&#039;,<br \/>\n    CASE WHEN n &#061; 80 THEN 1 ELSE 0 END, &#039;group_rows&#061;&#039;||n||&#039; (8\u57df x 10\u56fd)&#039;);<br \/>\nEND $$;<\/p>\n<p>&#8212; V3: HAVING \u8fc7\u6ee4\u540e\u5168\u90e8\u6ee1\u8db3\u9608\u503c<br \/>\nDO $$<br \/>\nDECLARE n int; mn_gmv numeric;<br \/>\nBEGIN<br \/>\n  SELECT count(*), min(gmv) INTO n, mn_gmv FROM (<br \/>\n    SELECT system_code, country_code, SUM(amount_usd) gmv<br \/>\n    FROM pg_txn GROUP BY 1,2 HAVING SUM(amount_usd) &gt; 100000) z;<br \/>\n  PERFORM pg_demo_v(&#039;V3_having_filter&#039;,<br \/>\n    CASE WHEN n&gt;0 AND mn_gmv &gt; 100000 THEN 1 ELSE 0 END,<br \/>\n    &#039;pass_groups&#061;&#039;||n||&#039; min_gmv&#061;&#039;||round(mn_gmv,2));<br \/>\nEND $$;<\/p>\n<p>&#8212; V4: \u65f6\u533a\u805a\u5408\u53e3\u5f84\u5dee\u5f02 (CN: UTC \u65e5 vs \u4e0a\u6d77\u672c\u5730\u65e5 \u7684\u6bcf\u65e5\u5206\u5e03\u4e0d\u540c)<br \/>\nDO $$<br \/>\nDECLARE diff int;<br \/>\nBEGIN<br \/>\n  SELECT count(*) INTO diff FROM (<br \/>\n    SELECT ((created_utc AT TIME ZONE &#039;UTC&#039;)::date)::text d, count(*) c FROM pg_txn WHERE country_code&#061;&#039;CN&#039; GROUP BY 1<br \/>\n    EXCEPT<br \/>\n    SELECT create_local_date::text, count(*) FROM pg_txn WHERE country_code&#061;&#039;CN&#039; GROUP BY 1) z;<br \/>\n  PERFORM pg_demo_v(&#039;V4_timezone_aggregate&#039;,<br \/>\n    CASE WHEN diff &gt; 0 THEN 1 ELSE 0 END,<br \/>\n    &#039;CN_utc_vs_localday_diff_days&#061;&#039;||diff||&#039; (\u65f6\u533a\u81f4\u65e5\u5f52\u5c5e\u4e0d\u540c)&#039;);<br \/>\nEND $$;<\/p>\n<p>&#8212; V5: \u591a\u5e01\u79cd\u7ed3\u7b97\u53e3\u5f84 (\u6df7\u5e01\u539f\u5e01\u603b\u989d \u2260 \u7f8e\u5143\u53e3\u5f84; \u6309\u5e01\u79cd\u5206\u7ec4\u53ef\u91cd\u7b97\u56de\u603b\u91cf)<br \/>\nDO $$<br \/>\nDECLARE orig_sum numeric; usd_sum numeric; recon numeric;<br \/>\nBEGIN<br \/>\n  SELECT sum(amount_orig), sum(amount_usd) INTO orig_sum, usd_sum FROM pg_txn;<br \/>\n  SELECT sum(s) INTO recon FROM (<br \/>\n    SELECT sum(amount_orig) s FROM pg_txn GROUP BY currency_code) z;<br \/>\n  PERFORM pg_demo_v(&#039;V5_multicurrency_settle&#039;,<br \/>\n    CASE WHEN orig_sum &lt;&gt; usd_sum AND recon &#061; orig_sum THEN 1 ELSE 0 END,<br \/>\n    &#039;mixed_orig&#061;&#039;||round(orig_sum,2)||&#039; usd_settle&#061;&#039;||round(usd_sum,2)||&#039; recon&#061;&#039;||round(recon,2));<br \/>\nEND $$;<\/p>\n<p>&#8212; V6: \u5206\u4f4d\u6570 (\u4e2d\u4f4d\u6570 &gt; 0 \u4e14 90 \u5206\u4f4d &gt;&#061; \u4e2d\u4f4d\u6570)<br \/>\nDO $$<br \/>\nDECLARE med numeric; p90 numeric;<br \/>\nBEGIN<br \/>\n  SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY amount_usd),<br \/>\n         percentile_cont(0.9) WITHIN GROUP (ORDER BY amount_usd)<br \/>\n    INTO med, p90 FROM pg_txn;<br \/>\n  PERFORM pg_demo_v(&#039;V6_percentile&#039;,<br \/>\n    CASE WHEN med&gt;0 AND p90&gt;&#061;med THEN 1 ELSE 0 END,<br \/>\n    &#039;median_usd&#061;&#039;||round(med,2)||&#039; p90_usd&#061;&#039;||round(p90,2));<br \/>\nEND $$;<\/p>\n<p>&#8212; V7: \u4f17\u6570 (\u6700\u9891\u7e41\u8d27\u5e01\u975e\u7a7a\u4e14\u5728\u679a\u4e3e\u5185)<br \/>\nDO $$<br \/>\nDECLARE m text;<br \/>\nBEGIN<br \/>\n  SELECT mode() WITHIN GROUP (ORDER BY currency_code) INTO m FROM pg_txn;<br \/>\n  PERFORM pg_demo_v(&#039;V7_mode_currency&#039;,<br \/>\n    CASE WHEN m IS NOT NULL THEN 1 ELSE 0 END, &#039;most_frequent_currency&#061;&#039;||m);<br \/>\nEND $$;<\/p>\n<p>&#8212; V8: \u5b57\u7b26\u4e32\u805a\u5408 (\u5ba2\u6237 #1 \u6709\u591a\u7b14, \u5217\u8868\u542b\u9017\u53f7)<br \/>\nDO $$<br \/>\nDECLARE s text;<br \/>\nBEGIN<br \/>\n  SELECT string_agg(reference_no, &#039;, &#039; ORDER BY txn_id) INTO s FROM pg_txn WHERE customer_id&#061;1;<br \/>\n  PERFORM pg_demo_v(&#039;V8_string_agg&#039;,<br \/>\n    CASE WHEN s IS NOT NULL AND length(s) &gt; 0 AND position(&#039;,&#039; in s) &gt; 0 THEN 1 ELSE 0 END,<br \/>\n    &#039;cust1_order_count&#061;&#039;||(length(s)-length(replace(s,&#039;,&#039;,&#039;&#039;))&#043;1));<br \/>\nEND $$;<\/p>\n<p>&#8212; V9: GROUPING SETS \u884c\u6570 &#061; 8 &#043; 10 &#043; 80 &#043; 1 &#061; 99<br \/>\nDO $$<br \/>\nDECLARE n int;<br \/>\nBEGIN<br \/>\n  SELECT count(*) INTO n FROM (<br \/>\n    SELECT system_code, country_code, GROUPING(system_code), GROUPING(country_code)<br \/>\n    FROM pg_txn GROUP BY GROUPING SETS ((system_code),(country_code),(system_code,country_code),())) z;<br \/>\n  PERFORM pg_demo_v(&#039;V9_grouping_sets&#039;,<br \/>\n    CASE WHEN n &#061; 99 THEN 1 ELSE 0 END,<br \/>\n    &#039;distinct_group_rows&#061;&#039;||n||&#039; (8&#043;10&#043;80&#043;1&#061;99)&#039;);<br \/>\nEND $$;<\/p>\n<p>&#8212; V10: ROLLUP(\u56fd\u5bb6,\u57df) \u884c\u6570 &#061; 80 &#043; 10 &#043; 1 &#061; 91<br \/>\nDO $$<br \/>\nDECLARE n int;<br \/>\nBEGIN<br \/>\n  SELECT count(*) INTO n FROM (<br \/>\n    SELECT system_code, country_code FROM pg_txn<br \/>\n    GROUP BY ROLLUP (country_code, system_code)) z;<br \/>\n  PERFORM pg_demo_v(&#039;V10_rollup&#039;,<br \/>\n    CASE WHEN n &#061; 91 THEN 1 ELSE 0 END,<br \/>\n    &#039;rollup_rows&#061;&#039;||n||&#039; (80&#043;10&#043;1&#061;91)&#039;);<br \/>\nEND $$;<\/p>\n<p>&#8212; V11: CUBE(\u56fd\u5bb6,\u57df) \u884c\u6570 &#061; 80 &#043; 10 &#043; 8 &#043; 1 &#061; 99 (\u6bd4 ROLLUP \u591a 8 \u884c\u57df\u5c0f\u8ba1)<br \/>\nDO $$<br \/>\nDECLARE n int;<br \/>\nBEGIN<br \/>\n  SELECT count(*) INTO n FROM (<br \/>\n    SELECT system_code, country_code FROM pg_txn<br \/>\n    GROUP BY CUBE (country_code, system_code)) z;<br \/>\n  PERFORM pg_demo_v(&#039;V11_cube&#039;,<br \/>\n    CASE WHEN n &#061; 99 THEN 1 ELSE 0 END,<br \/>\n    &#039;cube_rows&#061;&#039;||n||&#039; (80&#043;10&#043;8&#043;1&#061;99, \u6bd4ROLLUP\u591a8)&#039;);<br \/>\nEND $$;<\/p>\n<p>&#8212; V12: GROUPING() \u533a\u5206\u5c0f\u8ba1 (system_code \u88ab\u5c0f\u8ba1\u6389\u7684\u884c &#061; 10\u56fd\u5c0f\u8ba1 &#043; 1\u603b\u8ba1 &#061; 11)<br \/>\nDO $$<br \/>\nDECLARE n_sub int;<br \/>\nBEGIN<br \/>\n  SELECT count(*) INTO n_sub FROM (<br \/>\n    SELECT system_code, country_code, GROUPING(system_code) gs, GROUPING(country_code) gc<br \/>\n    FROM pg_txn GROUP BY GROUPING SETS ((system_code),(country_code),(system_code,country_code),())<br \/>\n  ) z WHERE gs&#061;1;<br \/>\n  PERFORM pg_demo_v(&#039;V12_grouping_func&#039;,<br \/>\n    CASE WHEN n_sub &#061; 11 THEN 1 ELSE 0 END,<br \/>\n    &#039;system_code_subtotal_rows&#061;&#039;||n_sub||&#039; (10\u56fd\u5c0f\u8ba1&#043;1\u603b\u8ba1&#061;11; \u7528GROUPING()\u800c\u975eIS NULL\u533a\u5206)&#039;);<br \/>\nEND $$;<\/p>\n<p>&#8212; V13: \u5168\u8868\u805a\u5408 Seq Scan \u4ee3\u4ef7 (\u672a\u7d22\u5f15\u5217 amount_orig \u5fc5\u5168\u626b, \u4e07\u4ebf\u7ea7\u987b\u5206\u533a\/\u7269\u5316\u89c6\u56fe)<br \/>\nDO $$<br \/>\nDECLARE r record;<br \/>\nBEGIN<br \/>\n  SELECT * INTO r FROM pg_plan_stats(&#039;SELECT SUM(amount_orig) FROM pg_txn&#039;);<br \/>\n  PERFORM pg_demo_v(&#039;V13_fullscan_aggregate&#039;,<br \/>\n    CASE WHEN r.node_type&#061;&#039;Seq Scan&#039; AND r.shared_blks &gt; 500 THEN 1 ELSE 0 END,<br \/>\n    &#039;node&#061;&#039;||r.node_type||&#039; shared_blks&#061;&#039;||r.shared_blks||&#039; (\u4e07\u4ebf\u7ea7\u987b\u5206\u533a\/\u7269\u5316\u89c6\u56fe)&#039;);<br \/>\nEND $$;<\/p>\n<p>&#8212; V14: \u8986\u76d6\u7d22\u5f15\u805a\u5408 (\u5e26\u8fc7\u6ee4) \u8d70 Index Only Scan, \u514d\u56de\u8868<br \/>\nDO $$<br \/>\nDECLARE r record;<br \/>\nBEGIN<br \/>\n  SELECT * INTO r FROM pg_plan_stats(<br \/>\n    &#039;SELECT system_code, SUM(amount_usd) FROM pg_txn WHERE system_code IN (&#039;&#039;ERP&#039;&#039;,&#039;&#039;CRM&#039;&#039;,&#039;&#039;SCM&#039;&#039;) GROUP BY system_code&#039;);<br \/>\n  PERFORM pg_demo_v(&#039;V14_covering_aggregate&#039;,<br \/>\n    CASE WHEN r.node_type&#061;&#039;Index Only Scan&#039; THEN 1 ELSE 0 END,<br \/>\n    &#039;node&#061;&#039;||r.node_type||&#039; shared_blks&#061;&#039;||r.shared_blks);<br \/>\nEND $$;<\/p>\n<p>&#8212; V15: \u6700\u7ec8\u805a\u5408\u8f93\u51fa\u884c\u6570 &#061; 8 \u57df (\u5206\u7ec4\u6b63\u786e, \u4e07\u4ebf\u7ea7\u53ef\u5e76\u884c Finalize Aggregate)<br \/>\nDO $$<br \/>\nDECLARE n int;<br \/>\nBEGIN<br \/>\n  SELECT count(*) INTO n FROM (<br \/>\n    SELECT system_code, SUM(amount_usd) FROM pg_txn GROUP BY system_code) z;<br \/>\n  PERFORM pg_demo_v(&#039;V15_group_output_rows&#039;,<br \/>\n    CASE WHEN n &#061; 8 THEN 1 ELSE 0 END, &#039;domain_groups&#061;&#039;||n||&#039; (Finalize Aggregate \u8f93\u51fa8\u884c)&#039;);<br \/>\nEND $$;<\/p>\n<p>&#8212; V16: \u4e07\u4ebf\u9884\u6f14 \u2014 \u7269\u5316\u89c6\u56fe\u9884\u805a\u5408\u5757\u6570 &lt;&lt; \u57fa\u8868\u5168\u805a\u5408\u5757\u6570<br \/>\nDO $$<br \/>\nDECLARE r1 record; r2 record; mvc int;<br \/>\nBEGIN<br \/>\n  SELECT count(*) INTO mvc FROM mv_gmv;<br \/>\n  SELECT * INTO r1 FROM pg_plan_stats(&#039;SELECT SUM(gmv_usd) FROM mv_gmv&#039;);<br \/>\n  SELECT * INTO r2 FROM pg_plan_stats(&#039;SELECT SUM(amount_orig) FROM pg_txn&#039;);<br \/>\n  PERFORM pg_demo_v(&#039;V16_materialized_summary&#039;,<br \/>\n    CASE WHEN r1.shared_blks &lt; r2.shared_blks THEN 1 ELSE 0 END,<br \/>\n    &#039;mv_rows&#061;&#039;||mvc||&#039; mv_blks&#061;&#039;||r1.shared_blks||&#039; base_blks&#061;&#039;||r2.shared_blks);<br \/>\nEND $$;<\/p>\n<p>&#8212; V17: \u805a\u5408\u786e\u5b9a\u6027 (\u540c\u67e5\u8be2\u4e24\u6b21\u7ed3\u679c\u4e00\u81f4 -&gt; \u6574\u4f53\u5e42\u7b49)<br \/>\nDO $$<br \/>\nDECLARE a numeric; b numeric;<br \/>\nBEGIN<br \/>\n  SELECT SUM(amount_usd) INTO a FROM pg_txn;<br \/>\n  SELECT SUM(amount_usd) INTO b FROM pg_txn;<br \/>\n  PERFORM pg_demo_v(&#039;V17_deterministic&#039;,<br \/>\n    CASE WHEN a IS NOT NULL AND a &#061; b THEN 1 ELSE 0 END, &#039;sum_usd&#061;&#039;||round(a,2));<br \/>\nEND $$;<\/p>\n<p>&#8212; V18: \u805a\u5408\u5ffd\u7565 NULL (COUNT(*)&#061;4, COUNT(v)&#061;3, AVG \u4e0d\u542b NULL)<br \/>\nDO $$<br \/>\nDECLARE c1 int; c2 int; av numeric; su numeric;<br \/>\nBEGIN<br \/>\n  WITH t(v) AS (VALUES (1),(2),(NULL),(3))<br \/>\n  SELECT COUNT(*), COUNT(v), AVG(v), SUM(v) INTO c1, c2, av, su FROM t;<br \/>\n  PERFORM pg_demo_v(&#039;V18_null_handling&#039;,<br \/>\n    CASE WHEN c1&#061;4 AND c2&#061;3 AND av&#061;2 AND su&#061;6 THEN 1 ELSE 0 END,<br \/>\n    &#039;count_all&#061;&#039;||c1||&#039; count_nonnull&#061;&#039;||c2||&#039; avg_ignores_null&#061;&#039;||av||&#039; sum&#061;&#039;||su);<br \/>\nEND $$;<\/p>\n<p>&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n&#8212; \u81ea\u68c0\u6c47\u603b<br \/>\n&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\nSELECT name AS check_name, pass AS pass_cnt, detail<br \/>\nFROM pg_demo_check ORDER BY name;<\/p>\n<p>SELECT CASE WHEN min(pass)&#061;1 THEN &#039;\u5168\u90e8\u901a\u8fc7 (ALL PASS)&#039; ELSE &#039;\u672a\u5168\u90e8\u901a\u8fc7 (SOME FAILED)&#039; END AS result<br \/>\nFROM pg_demo_check;<\/p>\n<p>SELECT count(*) AS total, sum(pass) AS passed FROM pg_demo_check;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8212;<br \/>\n&#8212; PostgreSQL 18 \u2014 SQL \u805a\u5408\u51fd\u6570\u4e0e\u5206\u7ec4\u96c6 (Aggregate Functions &amp; Grouping Sets)<br \/>\n&#8212; \u573a\u666f: \u4e07\u4ebf\u6570\u636e\u9ad8\u5e76\u53d1 \/ \u56fd\u9645\u65f6\u533a\u65f6\u95f4\u5dee \/ \u56fd\u9645\u591a\u79cd\u8d27\u5e01\u7ed3\u7b97<br \/>\n&#8212; \u672c\u6587\u4ef6\u3010\u81ea\u5305\u542b\u00b7\u5b8c\u5168\u5e42\u7b49\u3011: \u91cd\u590d\u8fd0\u884c\u7ed3\u679c\u9010\u5b57\u8282\u4e00\u81f4 (setseed \u4fdd\u8bc1\u9020\u6570\u4e00\u81f4)<br \/>\n&#8212; \u8fde\u63a5\u65b9\u5f0f: PGPASSWORD psql -U postgres -h localhost -p 5433 -d jewelry<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[954,323,2330,100,2032],"topic":[],"class_list":["post-118010","post","type-post","status-publish","format-standard","hentry","category-server","tag-postgresql","tag-323","tag-2330","tag-100","tag-2032"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>sql: SQL Aggregate Functions and Grouping Sets using PostgreSQL 18 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/118010.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"sql: SQL Aggregate Functions and Grouping Sets using PostgreSQL 18 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"-- -- PostgreSQL 18 \u2014 SQL \u805a\u5408\u51fd\u6570\u4e0e\u5206\u7ec4\u96c6 (Aggregate Functions &amp; Grouping Sets) -- \u573a\u666f: \u4e07\u4ebf\u6570\u636e\u9ad8\u5e76\u53d1 \/ \u56fd\u9645\u65f6\u533a\u65f6\u95f4\u5dee \/ \u56fd\u9645\u591a\u79cd\u8d27\u5e01\u7ed3\u7b97 -- \u672c\u6587\u4ef6\u3010\u81ea\u5305\u542b\u00b7\u5b8c\u5168\u5e42\u7b49\u3011: \u91cd\u590d\u8fd0\u884c\u7ed3\u679c\u9010\u5b57\u8282\u4e00\u81f4 (setseed \u4fdd\u8bc1\u9020\u6570\u4e00\u81f4) -- \u8fde\u63a5\u65b9\u5f0f: PGPASSWORD psql -U postgres -h localhost -p 5433 -d jewelry\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/118010.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-25T19:24:32+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/118010.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/118010.html\",\"name\":\"sql: SQL Aggregate Functions and Grouping Sets using PostgreSQL 18 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-10-25T19:24:32+00:00\",\"dateModified\":\"2026-10-25T19:24:32+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/118010.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/118010.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/118010.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"sql: SQL Aggregate Functions and Grouping Sets using PostgreSQL 18\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"sql: SQL Aggregate Functions and Grouping Sets using PostgreSQL 18 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/118010.html","og_locale":"zh_CN","og_type":"article","og_title":"sql: SQL Aggregate Functions and Grouping Sets using PostgreSQL 18 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"-- -- PostgreSQL 18 \u2014 SQL \u805a\u5408\u51fd\u6570\u4e0e\u5206\u7ec4\u96c6 (Aggregate Functions &amp; Grouping Sets) -- \u573a\u666f: \u4e07\u4ebf\u6570\u636e\u9ad8\u5e76\u53d1 \/ \u56fd\u9645\u65f6\u533a\u65f6\u95f4\u5dee \/ \u56fd\u9645\u591a\u79cd\u8d27\u5e01\u7ed3\u7b97 -- \u672c\u6587\u4ef6\u3010\u81ea\u5305\u542b\u00b7\u5b8c\u5168\u5e42\u7b49\u3011: \u91cd\u590d\u8fd0\u884c\u7ed3\u679c\u9010\u5b57\u8282\u4e00\u81f4 (setseed \u4fdd\u8bc1\u9020\u6570\u4e00\u81f4) -- \u8fde\u63a5\u65b9\u5f0f: PGPASSWORD psql -U postgres -h localhost -p 5433 -d jewelry","og_url":"https:\/\/www.wsisp.com\/helps\/118010.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-10-25T19:24:32+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"15 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/118010.html","url":"https:\/\/www.wsisp.com\/helps\/118010.html","name":"sql: SQL Aggregate Functions and Grouping Sets using PostgreSQL 18 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-10-25T19:24:32+00:00","dateModified":"2026-10-25T19:24:32+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/118010.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/118010.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/118010.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"sql: SQL Aggregate Functions and Grouping Sets using PostgreSQL 18"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/118010","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=118010"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/118010\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=118010"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=118010"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=118010"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=118010"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}