我有一张表,其中的客户是活跃的还是非活跃的。 不活动的是超过1年没有任何付款的人。我需要知道今年第一学期有多少非活动人员活跃起来。
我只有一张表格:" costumer id,支付金额,支付日期,状态"
我尝试过这样的事情:
select DISTINCT COSTUMER_ID
from finance
where (DATEPAID >= '2014-01-01'
and DATEPAID < '2014-07-01')
and COSTUMER_ID in (
select COSTUMER_ID
from finance
where DATEPAID < '2013-07-01'
)
第一部分是看今年谁支付了谁,第二部分,谁在生命中至少支付了一次。但是不能继续下去。有什么帮助吗?
示例数据:
costumer_id amount paid date paid todaystatus
1 50 2012-02-03 inactive
1 75 2013-02-03 inactive
2 10 2013-01-02 active
2 12 2014-04-02 active
3 65 2014-06-02 active
4 10 2011-01-06 active
4 30 2014-04-16 active
客户2和4是我想要的。 2在2014-01-02变得不活跃,但在2014-04-02重新激活 4在2012-01-06变得不活跃,但在2014-04-16重新启动
输出可以是costumer_id
的列表由于
答案 0 :(得分:2)
试试这个,并在SQLfiddle中添加一些数据样本来调整此查询。
select DISTINCT f1.COSTUMER_ID
from finance f1
where (DATEPAID >= '2014-01-01'
and DATEPAID < '2014-07-01')
and datediff(d, (
select top 1 f2.DATEPAID
from finance f2
where DATEPAID <> f1.DATEPAID
and f1.COSTUMER_ID=f2.COSTUMER_ID
order by f2.DATEPAID desc)
,f1.DATEPAID)>365
答案 1 :(得分:0)
您希望查看当前处于非活动状态的客户支付的最长日期。这似乎实现了您的业务规则:
select CUSTUMER_ID, max(DATEPAID) as maxdp
from finance
group by CUSTUMER_ID
having maxdp < '2013-07-01';
请注意,我将COSTOMERID
更改为CUSTOMERID
,这是更好的英文拼写。
答案 2 :(得分:0)
如果您定义&#34;非活动&#34;这样:
不活跃的是超过1年而没有任何付款的人。
你想知道:
今年第一学期有多少非活动变为活跃
回答这个问题的唯一方法是财务表是存储每笔交易,而不仅仅是余额。如果这是发生的事情,并根据示例数据,查询如下所示:
SELECT f1.CustomerID
FROM Finance f1
INNER JOIN Finance f2
ON f2.CustomerID = f1.CustomerID
AND f2.DatePaid =
(
SELECT TOP 1 DatePaid
FROM Finance f
WHERE f.CustomerID = f1.CustomerID and f1.DatePaid < f1.DatePaid
ORDER BY DatePaid DESC
)
AND f2.DatePaid <= DATEADD(year, -1, f1.DatePaid
WHERE f1.DatePaid >= '2014-01-01' and f1.DatePaid < '2014-07-01'
技巧是将表连接到自身,以便在一个记录中包含当前事务和先前事务。然后,您可以轻松选择所需的记录。
如果你有Sql Server 2012,你可以使用new LAG keyword使这个更多更简单,而且可能更快:
SELECT CustomerID
FROM Finance
WHERE DatePaid >= '2014-01-01' and DatePaid < '2014-07-01'
AND DATEADD(year, -1, DatePaid) > LAG(DateAdd)
OVER (PARTITION BY CustomerID
ORDER BY CustomerID, DatePaid DESC)
ORDER BY CustomerID