我有一个Customer
带有IsActive
列的表。如果“活跃”,则他有资格使用某些产品和服务。
我需要知道他是否有资格在某个日期。
问题在于他的记录可以更改,因此我必须在CustomerChanges
包含那些可以更改的属性的审计表中跟踪这些更改。每当我们更改他的记录时,我们都会向该表中添加一条记录,其中包含更改和日期。
我需要的是“让所有在xyz上活跃的客户都活跃起来”。
我将如何建模和查询这样的表?
(我正在使用SQL Server和EF Core)
愚蠢的例子:向客户发送生日礼物卡,但前提是客户的帐户没有被暂停,取消或欠款等。换句话说,仅当客户帐户在该日期处于“活动”状态时。
我相信从理论上讲,这就是您要实现的目标。
select Users.Id, Users.UserName, OrderedActivity.IsActive
from
(
select UserActivity.Id
, UserActivity.UpdateTime
, UserActivity.IsActive
, row_number() over
(partition by UserActivity.Id order by UserActivity.UpdateTime desc) as EntryNum
from UserActivity
where UserActivity.UpdateTime <= '20161210 10:00:00 AM'
) OrderedActivity
inner join Users
on Users.Id = OrderedActivity.Id
where OrderedActivity.EntryNum = 1;
本质上,它按日期对UserActivity中的条目进行排名(包含任何活动/不活动的更改),但不包括比所选日期新的内容。然后,它获取第一个条目(日期之前的最新更改)。
此时,对于每个用户记录,您都将有一个对应的IsActive标志可以使用(您可以通过在外部查询中添加另一个where子句来过滤掉此处不需要的内容)。
这是一个实际的例子:http : //rextester.com/QPSM50121
在C#中:
var filteredActivity =
Activity.Where(activity => activity.UpdateTime <= SOME_DATE)
.GroupBy(activity => activity.Id)
.Select(groupedActivities => groupedActivities.OrderByDescending(activity => activity.UpdateTime).FirstOrDefault()).ToList();
var results =
from user in Users
join activity in filteredActivity
on user.Id equals activity.Id
where activity.IsActive == 'Y'
select new { user.Id, activity.IsActive };
实际示例:http://rextester.com/SYZ96749
这是C#的另一个版本,但尝试将其全部整合到LINQ-to-SQL中。不确定问题是否会对您的EF小组有所帮助。
var results =
from activity in Activity
where activity.UpdateTime <= Convert.ToDateTime("10/12/2016 10:00:00")
group activity by activity.Id into groupedActivities
let mostRecentActivity =
(
from groupedActivity in groupedActivities
orderby groupedActivity.UpdateTime descending
select groupedActivity
).First()
join user in Users
on mostRecentActivity.Id equals user.Id
where mostRecentActivity.IsActive == 'Y'
select new { user.Id, mostRecentActivity.IsActive };
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句