假設:
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