sql-server - 在 SQL Server 上报告以前的记录
问题描述
我在这里有点挣扎。数据是捏造的,但查询的概念很真实。我需要选择客户、当前金额、先前金额、序列和日期,其中日期 < 1190105 并且日期/序列是客户在该日期点分组之前的最大日期/序列。
我已经花了好几天的时间尝试使用 HAVING、嵌套选择来尝试获取客户的最大日期/金额和最小日期/金额,但我无法完全理解它。我相信这应该很容易,但是您可以提供的任何帮助将不胜感激。
谢谢
**SEQ DATE CUSTOMER AMOUNT**
1 1181225 Bob 400
2 1181226 Fred 300
3 1190101 Bob 100
4 1190104 Fred 500
5 1190104 George 200
6 1190105 Bob 150
7 1190106 Bob 200
8 1190110 Fred 160
9 1190110 Bob 300
10 1190112 Fred 400
解决方案
选项 1 使用行号和滞后函数
SELECT
ROW_NUMBER() OVER (Partition By CustomerID Order By [Date]) as Sec,
[Date],
Customer,
Amount as CurrentAmount,
Lead(Amount) OVER (Partition By CustomerID, Order By [Date]) as PreviousAmount
FROM
YourTable
WHERE
[DATE] < 1190105
选择使用外部应用
SELECT
ROW_NUMBER() OVER (Partition By Customer Order By [Date]) as Sec,
[Date],
Customer,
Amount as CurrentAmount,
Prev.Amount as PreviousAmount
FROM
YourTable T
OUTER APPLY (
SELECT TOP 1 Amount FROM YourTable
WHERE Customer = T.Customer AND [Date] < T.[Date]
ORDER BY [DATE] DESC
) Prev
WHERE
DATE < 1190105
选项 3 使用相关子查询
SELECT
ROW_NUMBER() OVER (Partition By Customer Order By [Date]) as Sec,
[Date],
Customer,
Amount as CurrentAmount,
(
SELECT TOP 1 Amount FROM YourTable
WHERE Customer = T.Customer AND [Date] < T.[Date]
ORDER BY [DATE] DESC
) as PreviousAmount
FROM YourTable
WHERE
DATE < 1190105
推荐阅读
- python - 解析html页面的一些问题
- django - 当使用管理表单创建对象时,如何创建相关对象?
- firebase - 在 Firebase SetData 中向地图添加数据 - Flutter
- ruby-on-rails - 急切加载具有多个聚合的多个关联的“Rails 方式”是什么?
- mysql - 获取处理时间超过两分钟的记录?
- python - 定义类覆盖的问题 (__not__)
- python - 如何合并具有相同列但具有不同行值的两个数据框?
- python - 如何在 Spyder 中调试?
- angular - 我正在对我的 Angular 10 应用程序进行单元测试,我需要在运行时在 spec.ts 中设置会话项,以便执行下面的代码而无需将我注销
- android - ViewPager2 适配器被调用两次