用 SQL 找出某只股票连续上涨的最长天数

涉及多张中间表:

sql 复制代码
SELECT MAX(consecutive_day)
FROM (SELECT COUNT(*) as consecutive_day
  FROM (SELECT trade_date, SUM(rise_mark) OVER (ORDER BY trade_date) AS days_no_gain
     FROM (SELECT trade_date,
                CASE
                    WHEN closing_price > LAG(closing_price) OVER (ORDER BY trade_date)
                         THEN 0
                    ELSE 1 END AS rise_mark
           FROM stack_price) subquery1) subquery2
  GROUP BY days_no_gain) subquery3;

Over 语法

sql 复制代码
SELECT
  product_id,
  sale_date,
  sale_amount,
  SUM(sale_amount) OVER (PARTITION BY product_id ORDER BY sale_date) AS total_sales,
  SUM(sale_amount) OVER (PARTITION BY product_id) AS running_total
FROM
  sales;

basic:

sql 复制代码
order_id | customer_id | order_amount
-------------------------------------
1        | 1           | 100
2        | 1           | 150
3        | 2           | 200
4        | 2           | 50
5        | 2           | 120

result:

sql 复制代码
order_id | customer_id | order_amount | total_amount | running_total
-------------------------------------------------------------------
1        | 1           | 100          | 100          | 250
2        | 1           | 150          | 250          | 250
3        | 2           | 200          | 200          | 370
4        | 2           | 50           | 250          | 370
5        | 2           | 120          | 370          | 370

Window function

A window function is a type of function in SQL that performs calculations across a set of rows called a "window." The window is defined by the OVER clause, which specifies the partitioning and ordering of the rows.

SUM(order_amount) OVER (PARTITION BY customer_id ORDER BY order_id):

SUM(order_amount): This is the window function itself, in this case, the SUM function is used to calculate the sum of the order_amount.

OVER: It introduces the window function and specifies the window's characteristics.

PARTITION BY customer_id: This clause divides the rows into separate partitions based on the customer_id. Each partition will have its own calculation of the sum.

ORDER BY order_id: This clause determines the order in which the rows are processed within each partition. In this case, it orders the rows by the order_id.

SUM(order_amount) OVER (PARTITION BY customer_id):

This is another usage of the SUM window function, but without specifying the ordering using ORDER BY. Without the ORDER BY clause, the entire partition is considered, and the calculation is performed on all rows with the same customer_id.

The window function, in combination with the OVER clause, allows us to perform calculations within specific partitions and orderings defined by the columns specified. It provides a way to aggregate or calculate values based on a subset of rows without collapsing the result set or using subqueries.

Other common window functions include ROW_NUMBER(), AVG(), MIN(), MAX(), and LEAD()/LAG(), among others. Each function has its own specific purpose and behavior within the window frame defined by the OVER clause.

OLAP / OLTP

SQL 作为查询语言而发明, 名字叫 "结构化查询"(structured query), 数学基础是 "关系模型", 没有考虑复杂计算 (与之相对的是离散数学, 把 "数据存储 + 数据计算" 做在一起)

近年来, 数据处理和计算的需求越来越大, 于是 OLAP(联机分析处理)和 OLTP(联机事务处理)的概念就诞生了.

  • OLAP: Online Analytical Processing.
  • OLTP: Online Transaction Processing.

它们基于数据库, 属于"数据库 + 计算层".

处理海量数据, 有效率瓶颈.

相关推荐
嘘神秘用3 小时前
布:AI 驱动的 Redis 客户端,更快、更直观
数据库·人工智能·redis
东北小狐狸-Hellxz5 小时前
Redis 哨兵搭建+ACL权限控制
数据库·redis
研究员子楚6 小时前
GEO行业发展标准体系白皮书V2.0-第09卷 · 适配篇:硅基主权伦理宪章与行业适配宣言
数据库·人工智能·geo
l134062082357 小时前
鸿蒙实战:RDB 数据库设计与 DatabaseService
数据库·华为·harmonyos·鸿蒙系统
山峰哥7 小时前
数据库工程与索引策略实战指南‌
服务器·数据库·sql·oracle·深度优先
谙忆8 小时前
图片版权保护工程实战:明水印、盲水印(DCT隐写)、Referer防盗链与签名URL怎么落地
数据库
KaMeidebaby8 小时前
卡梅德生物技术快报|抗体合成:多肽抗体合成工程化方案:Nsp2 保守肽多抗制备与多维度验证
前端·网络·数据库·人工智能·算法
xfhuangfu8 小时前
19c CDB架构下的数据库启动和停止
数据库·架构
神道君天下8 小时前
填充与积累:积分与面积的可视化
数据库·oracle
爱折腾的小黑牛8 小时前
小程序云开发数据模型设计:礼账系统的三表结构
数据库·架构