Поиск данных на определенную дату - PullRequest
4 голосов
/ 31 мая 2011

У меня есть таблица, где хранятся записи для пользователя

Это включает в себя столбцы username, FromDate, ToDate, Status

У меня есть требование, где янеобходимо узнать количество активных пользователей (статус) на 1 Dec 2010 и 1 April 2011.

Другими словами, мы пытаемся определить, сколько пользователей было активным на 1 Dec 2010 и 1 Apr 2011, поэтомучто мы можем сравнить, сколько пользователей было добавлено / потеряно.

Как это можно сделать?

Ответы [ 3 ]

3 голосов
/ 31 мая 2011

Пользователи, которые были активны как 1 декабря, так и 1 апреля:

with cte
as
(
    select UserName, FromDate, ToDate
    from MyTable
    where Status = 'Active' -- adjust to your status type
)
select distinct UserName
from cte
where 
    FromDate < '20101202' 
    and ToDate >= '20101201' and
    UserName in
    (
        select *
        from cte
        where FromDate < '20110402' and ToDate >= '20110401'
    )

Чтобы увидеть, каких пользователей добавили и каких пользователей удалили, вы можете сделать что-то вроде этого:

with cte
as
(
    select UserName, FromDate, ToDate
    from MyTable
    where Status = 'Active' -- adjust to your status type
)
select UserName, sum(WasActiveOnDecFirst) WasActiveOnDecFirst, sum(WasActiveOnAprFirst) WasActiveOnAprFirst
from
(
    select 
        isnull(du.UserName, au.UserName) UserName,
        case when du.UserName is null then 0 else 1 end WasActiveOnDecFirst,
        case when au.UserName is null then 0 else 1 end WasActiveOnAprFirst
    from
    (
        select distinct UserName
        from cte
        where FromDate < '20101202' and ToDate >= '20101201'
    ) du
        full join
    (
        select distinct UserName
        from cte
        where FromDate < '20110402' and ToDate >= '20110401'
    ) au
        on du.UserName = au.UserName
) tt
group by UserName
with rollup

Результат будет выглядеть следующим образом:

UserName             WasActiveOnDecFirst WasActiveOnAprFirst
-------------------- ------------------- -------------------
user1                1                   1
user2                1                   1
user3                1                   1
user4                0                   1
NULL                 3                   4

Последняя строка - это общее количество пользователей.

2 голосов
/ 31 мая 2011
declare @FromDate date = '20101201'
declare @ToDate   date = '20110401'

select
  count(case when @FromDate between FromDate and ToDate then 1 end) as CountFromDate,
  count(case when @ToDate   between FromDate and ToDate then 1 end) as CountToDate
from YourTable
where FromDate <= @ToDate and
      ToDate >= @FromDate and
      Status = 1  
1 голос
/ 31 мая 2011

РЕДАКТИРОВАТЬ: Пожалуйста, обратитесь ответ, предоставленный Микаэль Эрикссон .Это выглядит намного лучше, чем запрос, написанный мной.

Если у вас есть только две даты для сравнения, вы можете сделать что-то вроде этого.Снимок экрана # 1 показывает вывод приведенного ниже запроса в отношении данных примера.Пользователи 1, 4, 6 и 9 были активны на 2010-12-01.Пользователи 1, 3, 4, 5, 7 и 8 были активны 2011-04-01.Отсюда количество 4 и 6 ..

DECLARE @Date1  DATETIME
DECLARE @Date2  DATETIME

SET @Date1 = '2010-12-01'
SET @Date2 = '2011-04-01'

    SELECT  @Date1          AS AsOnDate
        ,   COUNT(Username) AS ActiveCount
    FROM    dbo.Users
    WHERE   @Date1 BETWEEN FromDate AND ToDate
UNION
    SELECT  @Date2          AS AsOnDate
        ,   COUNT(Username) AS ActiveCount
    FROM    dbo.Users
    WHERE   @Date2 BETWEEN FromDate AND ToDate

Надеюсь, что поможет.

Снимок экрана № 1:

Output

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...