假设:
1. 相同 ID 下 PAY_DATE 唯一
2. “第一笔”的定义为:
2.1 相同 ID 下
2.2 小于该日期且最接近该日期
2.3 PAY_AMT != 0
3. PAY_DATE 格式为 'yyy/mm/dd' 固定 9 码
4. PAY_AMT 最大为 10 位正整数
可尝试以下 sql:
select t3.ID,t3.PAY_DATE,t3.PAY_AMT,
SUBSTRING(
MAX(t3.AMT),
CHARINDEX('-',MAX(t3.AMT)) + 1,
10
) as AMT
from (
select t1.ID,t1.PAY_DATE,t1.PAY_AMT,
t2.PAY_DATE + '-' + cast(t2.PAY_AMT as char(10)) as AMT
from price as t1 inner join price as t2
on t1.ID = t2.ID
where t1.PAY_AMT = 0 and
t2.PAY_DATE < t1.PAY_DATE and
t2.PAY_AMT != 0
) as t3
group t3.ID,t3.PAY_DATE,t3.PAY_AMT
※ 引述《superttl (ttl)》之铭言:
: (针对 SQL 语言的问题,用这个标题。请用 Ctrl+Y 砍掉这行)
: 数据库名称:MS SQL
: 数据库版本:SQL 2000
: 内容/问题描述:
: 我有一个 TABLE (price) 里面的字段有 ID, PAY_DATE, PAY_AMT
: 资料内容如下:
: 1101 103/05/30 100
: 1101 103/05/29 99
: 1101 103/05/28 98
: 1101 103/05/27 0
: 1101 103/05/26 0
: 1101 103/05/23 99
: 1102 103/05/30 34
: 1102 103/05/29 0
: 1102 103/05/28 0
: 1102 103/05/27 66
: 1102 103/05/26 0
: 1102 103/05/23 44
: 我如何写一巢状式 select [先挑出 PAY_AMT 为 0 的资料,再选择小于此日期其 PAY_AMT <> 0 的第一笔]
: 得到的结果如下:
: 1101 103/05/27 0 99
: 1101 103/05/26 0 99
: 1102 103/05/29 0 66
: 1102 103/05/28 0 66
: 1102 103/05/26 0 44