sql-server - SQL-选择一个值大于第一个值日的行
问题描述
我在 SQL 中有下表-
user_id purchase_date revenues
-------------------------------------
A 2018-01-01 30
A 2018-01-02 28
A 2018-01-04 45
A 2018-01-06 55
B 2018-01-03 20
B 2018-01-05 21
而且我必须只选择用户收入大于第一天收入的行。
意味着预期的结果应该是-
user_id purchase_date revenues
-------------------------------------
A 2018-01-04 45
A 2018-01-06 55
B 2018-01-05 21
我刚刚开始学习 SQL,我可以自己进行每个查询(按日期或每个用户的收入),但我似乎无法掌握这种复杂性的窍门。
非常感谢!
解决方案
您可以使用窗口函数 ROW_NUMBER()
with A as
(
select user_id, purchase_date, revenues
from
(values
('A', '2018-01-01', 30),
('A', '2018-01-02', 28),
('A', '2018-01-04', 45),
('A', '2018-01-06', 55),
('B', '2018-01-03', 20),
('B', '2018-01-05', 21)) as T(user_id, purchase_date, revenues)
),
B as (
select
ROW_NUMBER() over (partition by user_id order by purchase_date) as n,
user_id, purchase_date, revenues from A
),
C as (
select * from B where n = 1
)
select
A.user_id, A.purchase_date, A.revenues
from
A inner join C on (A.user_id = C.user_id and A.revenues > C.revenues)
你也可以使用 FIRST_VALUE 函数
with A as
(
select user_id, purchase_date, revenues
from
(values
('A', '2018-01-01', 30),
('A', '2018-01-02', 28),
('A', '2018-01-04', 45),
('A', '2018-01-06', 55),
('B', '2018-01-03', 20),
('B', '2018-01-05', 21)) as T(user_id, purchase_date, revenues)
),
B as (
select
user_id, purchase_date, revenues,
FIRST_VALUE(revenues) over (partition by user_id order by purchase_date) as n
from A
)
select user_id, purchase_date, revenues from B where revenues > n;
推荐阅读
- batch-file - 如何将我的 CMD 命令设置为快捷方式?
- c++ - 使用 LuaBridge 导出容器类
- javascript - js范围和窗口对象?
- c++ - 为什么函数指针比虚方法执行得更好
- python - 有没有办法将数据库的强大功能与文本文件库的透明性和简单性结合起来?
- mysql - 无法按照官方结构连接到 mysql docker 容器
- java - 将单个xml节点转换为java类
- reactjs - Ant Design - 欧元金额的数字输入
- sql - 特定值的 where 子句中的情况 oracle
- javascript - 如何在javascript中将数组作为对象传递?