2

我很困惑如何构建一个算法来确定我们系统中活跃客户的平均数量。他们存储了各种信息,ID、联系人开始日期、联系人结束日期、帐户开始和结束日期、交易日期等。并非所有这些信息都有我可以捕捉到的任何一致的日常活动。我无法弄清楚如何确定特定日期的活跃客户数量。

我无法更改数据库的结构或大幅修改表,因此我需要使用我所拥有的。我认为这样做的一个想法是检查联系结束日期是否大于日期 X,或者是否为空 - 并检查联系开始日期是否小于日期 X。我将其插入但得到了我输入的任何一天都使用相同的数字。还有其他方法可以尝试吗?我可以在上班时添加该代码,但现在我将其提交以供考虑...

**对不起..我遗漏了一个重要的部分。我需要能够确定过去任何特定日子的总活跃量,然后获得一年的每日平均总数。在以下帖子的帮助下,我可能已经解决了第一部分。首先,我在查询中创建了一个变量来保存我需要搜索的日期...@report_dt

and contact_end_dt >= @report_dt
and contact_start_dt <= @report_dt

那件作品为我做到了。现在我需要弄清楚如何在一年内循环遍历这个变量,并一次一天地增加 @report_dt 变量。

感谢所有的帮助......你太棒了!道格

4

4 回答 4

1

您能否查询 sysdate 在联系开始日期和联系结束日期之间的位置?

您有联系开始日期和联系结束日期、帐户开始日期和结束日期。您可以依赖帐户开始日期和结束日期中的数据吗?帐户在被视为不活动之前可以多长时间没有活动?如果你能回答这个问题,你应该能够得到答案。

谢谢,苏珊

于 2012-05-10T14:22:08.647 回答
1

如果您可以通过包括以下内容进行扩展:
- 您尝试但没有工作的代码
- 表的实际架构 (包括数据类型、约束等)
- 示例输入和输出数据

尽管如此,您想要的简单查询是......

SELECT
  *
FROM
  yourTable
WHERE
      (contact_start_date >= CAST('20120510' AS DATETIME) OR contact_start_date IS NULL)
  AND (contact_end_date   <= CAST('20120510' AS DATETIME) OR contact_end_date   IS NULL)

(尽管根据您的数据限制,您可能不需要检查 NULL 开始日期。)

如果这与您已经尝试过的重复,我将等待您的问题的任何更新:)

于 2012-05-10T14:31:47.363 回答
1

道格,

对于客户“活跃”意味着什么,您还没有提供最模糊的概念。一旦你弄清楚了,你就可以解决这个问题。

您能否编写一个查询,列出每个日期为 2012 年 5 月 10 日的活跃客户一次?如果是这样的话,

  1. 创建一个单独的日期表,每一天(或工作日)一行
  2. 使用您为 2012-05-10 编写的查询,但使用日期表中的左外连接。仅选择 dateTable.theDate、count(*) 并按 theDate 分组。

如果您想要更具体的内容,请在您的问题中提出具体的内容。一个没有单个列或表名的杂乱无章的问题不会给你太多帮助。请查看此处获得支持的问题。

于 2012-05-10T16:39:00.610 回答
0

这是一个有趣的问题。以下查询使用 SQL Server 和任何支持 row_nubmer() 的数据库来解决问题,假设您在所有日期都有开始和停止:

with starts as 
(
   select start_date as thedate,
       row_number() over (partition by null order by start_date) as cumstarts
   from customers
),
ends as 
(
   select end_date as thedate,
       row_number() over (partition by null order by end_date) as cumends
   from customers
)
select thedate, cumstarts - cumends
from 
(
  (select * from starts) 
  union all 
  (select * from ends)
) t
group by thedate

一些数据库直接提供累积和,这使得它更容易。

当您在不同日期开始和停止时,SQL Server 中的问题有点棘手。

于 2012-05-10T15:51:53.643 回答