如何设计一个表,记录一个时间范围内的客户状态?

古怪的

我有一个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 };

实际使用中:http//rextester.com/QUGR95471

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在一个时间范围内按多列查找重复的行

如何安排Windows任务在一个时间范围内每天重复?

确定一个时间范围内SQL代理的预期运行时间

在当前时间范围内绘制另一个时间范围内的指标

在 R 中测试 case 是否在一个时间范围内和一个唯一的 ID

RXJS 显示一个时间范围内的累计结果

Spark 1.5.2:在一个时间范围内对DataFrame行进行分组

SQL获取一个时间范围内的所有值-以及之前的值

检查LocalDateTime是否在一个时间范围内

是否有一个 Excel 公式可以返回一个时间范围内的日历月数?

如何修改数据以在另一个时间的特定范围内删除ID

计算一个时间在一个日期范围内出现的次数

比较时间:检查给定时间是否在另一个时间范围内

选择在一个时间范围内显示最少n条记录的所有唯一条目

如何制作一个范围内特定日期时间数据的临时表?

有没有办法让 worksheetfunction.randbetween 在一个时间范围内工作?

Power BI-在另一个记录的时间范围内查找记录

SQL查询以获取在一个时间范围内包含多个实例的值

避免循环:在一个时间范围内定义动作块

如何根据另一个字段在特定时间范围内查找记录

检查时间是否在一个时间范围内,还检查用户是否仅给出开始时间或结束时间

在一个时间间隔内生成时间戳范围并查询所有重叠事件

在给定的时间间隔内,一个时间范围有多少小时?

检查一个时间范围是否进入另一个时间范围

将一个时间范围缩小到另一个时间范围的算法

如何为一个范围内的每一天创建一个新的临时表?

为表上的每个组选择最后一个时间戳(记录)

python如何对一个范围内的奇数求和?

我如何找到iso 8601时间是否在一个小时范围内?