<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>分析 on 老张开工了</title>
    <link>/%E5%88%86%E6%9E%90/</link>
    <description>Recent content in 分析 on 老张开工了</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Tue, 11 Feb 2025 10:00:00 +0800</lastBuildDate>
    <atom:link href="/%E5%88%86%E6%9E%90/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>窗口函数</title>
      <link>/posts/2025/02/window-functions/</link>
      <pubDate>Tue, 11 Feb 2025 10:00:00 +0800</pubDate>
      <guid>/posts/2025/02/window-functions/</guid>
      <description>窗口函数是 PostgreSQL 最强大的分析工具之一。它在不改变行数的前提下，为每一行计算一个&amp;quot;窗口&amp;quot;内的聚合值——让你同时看到&amp;quot;行级&amp;quot;和&amp;quot;聚合级&amp;quot;的数据。&#xA;窗口函数 vs 普通聚合 普通聚合用 GROUP BY 将多行压缩为一行：&#xA;SELECT product, SUM(amount) FROM sales GROUP BY product; -- 结果：每种商品一行 窗口函数保留原始行数，额外返回聚合值：&#xA;SELECT product, amount, SUM(amount) OVER () AS 总计 FROM sales; -- 结果：每行不变，多一列&amp;#34;总计&amp;#34; 创建练习数据集 -- 月度销售数据 CREATE TABLE monthly_sales ( id SERIAL PRIMARY KEY, product VARCHAR(50), category VARCHAR(50), month DATE NOT NULL, sales_amount NUMERIC(10,2), sales_qty INTEGER ); INSERT INTO monthly_sales (product, category, month, sales_amount, sales_qty) VALUES (&amp;#39;笔记本电脑&amp;#39;, &amp;#39;电子产品&amp;#39;, &amp;#39;2025-01-01&amp;#39;, 300000, 50), (&amp;#39;笔记本电脑&amp;#39;, &amp;#39;电子产品&amp;#39;, &amp;#39;2025-02-01&amp;#39;, 350000, 58), (&amp;#39;笔记本电脑&amp;#39;, &amp;#39;电子产品&amp;#39;, &amp;#39;2025-03-01&amp;#39;, 280000, 46), (&amp;#39;手机&amp;#39;, &amp;#39;电子产品&amp;#39;, &amp;#39;2025-01-01&amp;#39;, 450000, 112), (&amp;#39;手机&amp;#39;, &amp;#39;电子产品&amp;#39;, &amp;#39;2025-02-01&amp;#39;, 520000, 130), (&amp;#39;手机&amp;#39;, &amp;#39;电子产品&amp;#39;, &amp;#39;2025-03-01&amp;#39;, 480000, 120), (&amp;#39;耳机&amp;#39;, &amp;#39;电子产品&amp;#39;, &amp;#39;2025-01-01&amp;#39;, 60000, 200), (&amp;#39;耳机&amp;#39;, &amp;#39;电子产品&amp;#39;, &amp;#39;2025-02-01&amp;#39;, 55000, 180), (&amp;#39;耳机&amp;#39;, &amp;#39;电子产品&amp;#39;, &amp;#39;2025-03-01&amp;#39;, 70000, 240), (&amp;#39;运动鞋&amp;#39;, &amp;#39;服饰&amp;#39;, &amp;#39;2025-01-01&amp;#39;, 80000, 135), (&amp;#39;运动鞋&amp;#39;, &amp;#39;服饰&amp;#39;, &amp;#39;2025-02-01&amp;#39;, 75000, 125), (&amp;#39;运动鞋&amp;#39;, &amp;#39;服饰&amp;#39;, &amp;#39;2025-03-01&amp;#39;, 65000, 108), (&amp;#39;T恤&amp;#39;, &amp;#39;服饰&amp;#39;, &amp;#39;2025-01-01&amp;#39;, 30000, 300), (&amp;#39;T恤&amp;#39;, &amp;#39;服饰&amp;#39;, &amp;#39;2025-02-01&amp;#39;, 35000, 350), (&amp;#39;T恤&amp;#39;, &amp;#39;服饰&amp;#39;, &amp;#39;2025-03-01&amp;#39;, 28000, 280), (&amp;#39;咖啡机&amp;#39;, &amp;#39;家居&amp;#39;, &amp;#39;2025-01-01&amp;#39;, 65000, 50), (&amp;#39;咖啡机&amp;#39;, &amp;#39;家居&amp;#39;, &amp;#39;2025-02-01&amp;#39;, 55000, 42), (&amp;#39;咖啡机&amp;#39;, &amp;#39;家居&amp;#39;, &amp;#39;2025-03-01&amp;#39;, 40000, 30); 排名函数 -- ROW_NUMBER：连续的排名（不并列） SELECT product, month, sales_amount, ROW_NUMBER() OVER (ORDER BY sales_amount DESC) AS 总排名 FROM monthly_sales; -- RANK：并列排名（跳过后续序号） SELECT product, month, sales_amount, RANK() OVER (ORDER BY sales_amount DESC) AS 排名_可并列 FROM monthly_sales; -- DENSE_RANK：并列排名（不跳过后续序号） SELECT product, month, sales_amount, DENSE_RANK() OVER (ORDER BY sales_amount DESC) AS 排名_密集 FROM monthly_sales; 三者的区别：</description>
    </item>
  </channel>
</rss>
