SQL - 记录满足要求的第一个日期
SQL - First Date that a record meets requirement
我们有一个 table - 称之为 table1_summary T1
。这是历史 table 每个快照月的所有数据
它具有可追溯到 2008 年的每个快照月份的每条记录。因此,如果记录是在快照月份 2013-01-01
中创建的,那么每个月的每个快照月份的记录都会在此 table 中多次出现创建当前日期的日期。
说这就是我正在使用的 table 排列方式。如何将我的查询添加到我将提取第一个 snapshot_month 的位置,此记录是 [=15=].00
for Record_Balance
?所以对于这个例子 2011-05-31
将是我想要 return.
的记录
snapshot_date---| Record_Number---|Record_Balance
2011-02-28 ------| 12345 ----------------| 276.00
2011-03-31 ------| 12345 ----------------| 276.00
2011-04-30 ------| 12345 ----------------| 175.00
2011-05-31 ------| 12345 ----------------| 0.00
2011-06-30 ------| 12345 ----------------| 0.00
2011-07-31 ------| 12345 ----------------| 0.00
2011-08-31 ------| 12345 ----------------| 0.00
这是我的示例查询
Select T1.snapshot_date
,T1.Record_number
,T1.Record_balance
from table1_summary t1
where t1.record_number = '12345'
我想对所有记录都做,不限制
假设您想要每个记录编号的第一个零余额:
SELECT
T1.Record_number,
MIN(T1.snapshot_date) MinDate
FROM table1_summary t1
WHERE T1.Record_balance = 0
GROUP BY T1.Record_number
您可以通过多种方式实现。一种方法是使用 CTE 按日期排序:
DECLARE @table1_summary TABLE
(
snapshot_date DATE ,
Record_number INT ,
Record_balance MONEY
)
INSERT INTO @table1_summary
VALUES ( '2011-02-28', 12345, 276.00 ),
( '2011-03-31', 12345, 276.00 ),
( '2011-04-30', 12345, 175.00 ),
( '2011-05-31', 12345, 0.00 ),
( '2011-06-30', 12345, 0.00 ),
( '2011-07-31', 12345, 0.00 ),
( '2011-08-31', 12345, 0.00 ),
( '2011-02-28', 12346, 1.00 ),
( '2011-08-31', 12346, 0.00 ),
( '2011-09-30', 12346, 0.00 );
WITH cte
AS ( SELECT * ,
ROW_NUMBER() OVER ( PARTITION BY Record_number ORDER BY ( snapshot_date ) ) AS RN
FROM @table1_summary
WHERE Record_balance = 0
)
SELECT T1.snapshot_date ,
T1.Record_number ,
T1.Record_balance
FROM cte t1
WHERE --t1.record_number = 12345 AND
t1.RN = 1
输出:
snapshot_date Record_number Record_balance
2011-05-31 12345 0.00
2011-08-31 12346 0.00
如果您想按特定记录编号过滤,只需取消注释 --t1.record_number = 12345 AND
。
我们有一个 table - 称之为 table1_summary T1
。这是历史 table 每个快照月的所有数据
它具有可追溯到 2008 年的每个快照月份的每条记录。因此,如果记录是在快照月份 2013-01-01
中创建的,那么每个月的每个快照月份的记录都会在此 table 中多次出现创建当前日期的日期。
说这就是我正在使用的 table 排列方式。如何将我的查询添加到我将提取第一个 snapshot_month 的位置,此记录是 [=15=].00
for Record_Balance
?所以对于这个例子 2011-05-31
将是我想要 return.
snapshot_date---| Record_Number---|Record_Balance
2011-02-28 ------| 12345 ----------------| 276.00
2011-03-31 ------| 12345 ----------------| 276.00
2011-04-30 ------| 12345 ----------------| 175.00
2011-05-31 ------| 12345 ----------------| 0.00
2011-06-30 ------| 12345 ----------------| 0.00
2011-07-31 ------| 12345 ----------------| 0.00
2011-08-31 ------| 12345 ----------------| 0.00
这是我的示例查询
Select T1.snapshot_date
,T1.Record_number
,T1.Record_balance
from table1_summary t1
where t1.record_number = '12345'
我想对所有记录都做,不限制
假设您想要每个记录编号的第一个零余额:
SELECT
T1.Record_number,
MIN(T1.snapshot_date) MinDate
FROM table1_summary t1
WHERE T1.Record_balance = 0
GROUP BY T1.Record_number
您可以通过多种方式实现。一种方法是使用 CTE 按日期排序:
DECLARE @table1_summary TABLE
(
snapshot_date DATE ,
Record_number INT ,
Record_balance MONEY
)
INSERT INTO @table1_summary
VALUES ( '2011-02-28', 12345, 276.00 ),
( '2011-03-31', 12345, 276.00 ),
( '2011-04-30', 12345, 175.00 ),
( '2011-05-31', 12345, 0.00 ),
( '2011-06-30', 12345, 0.00 ),
( '2011-07-31', 12345, 0.00 ),
( '2011-08-31', 12345, 0.00 ),
( '2011-02-28', 12346, 1.00 ),
( '2011-08-31', 12346, 0.00 ),
( '2011-09-30', 12346, 0.00 );
WITH cte
AS ( SELECT * ,
ROW_NUMBER() OVER ( PARTITION BY Record_number ORDER BY ( snapshot_date ) ) AS RN
FROM @table1_summary
WHERE Record_balance = 0
)
SELECT T1.snapshot_date ,
T1.Record_number ,
T1.Record_balance
FROM cte t1
WHERE --t1.record_number = 12345 AND
t1.RN = 1
输出:
snapshot_date Record_number Record_balance
2011-05-31 12345 0.00
2011-08-31 12346 0.00
如果您想按特定记录编号过滤,只需取消注释 --t1.record_number = 12345 AND
。