Нужен вывод на основе количества или веса на основе TimeDifference - PullRequest
0 голосов
/ 18 августа 2011
TID   StartTime                   Uid   WId
1     2011-06-06 09:30:00.000     10    1.5
2     2011-06-06 09:40:00.000     10    3.5
3     2011-06-06 09:50:00.000     10    1.0
4     2011-06-06 10:45:00.000     10    2.5
5     2011-06-06 10:50:00.000     10    1.5
6     2011-06-06 10:55:00.000     10    0
7     2011-06-06 11:30:00.000     10    0
8     2011-06-06 11:35:00.000     10    0
9     2011-06-06 11:40:00.000     10    0
10    2011-06-06 11:43:00.000     10    0
11    2011-06-06 11:20:00.000     11    7.0
12    2011-06-06 11:30:00.000     11    1.0

У меня есть данные в Таблице TblTask, мне нужно написать запрос для вычисления (сумма (Wid) или Количество (TID)) на основе разницы во времени каждого Время начала с другим временем начала, имеющим разницу во времени 1 час или около 1 часа Группировать по UID.

Например, возьмите время первого запуска (2011-06-06 09: 30: 00.000); ближайшее время начала с <= 1 часом (2011-06-06 10: 30: 00.000) (если SUM (Wid)> = 5,0 ИЛИ Количество строк> = 5). Здесь веса: (1,5 + 3,5 + 1,0 = 6,0) Первые 3 строки TID (1,2,3) как вес> = 5 нам нужно показать записи и TID (3,4,5) Здесь весовые коэффициенты (1,0 + 2,5 + 1,5 = 5,0) Для TID'd (4,5,6,7,8,9,10) Здесь Count (TID 7) Так что я хочу отобразить все записи от 4 до 10

Для TID (5,6,7,8,9,10) в виде Count (TID> 5) я хочу отобразить все записи от 5 до 10

Для TID (6,7,8,9,10) в виде количества (TID = 5) я хочу отобразить все записи от 6 до 10

Для TID 11 при WID> 5 я хочу отобразить запись 11

Для TID (11,12) при WID> 5 раз я хочу отобразить записи 11 и 12

Желаемый результат будет:

TID    StartTime                 Uid  
1     2011-06-06 09:30:00.000    10    
2     2011-06-06 09:40:00.000    10     
3     2011-06-06 09:50:00.000    10   
3     2011-06-06 09:50:00.000    10    
4     2011-06-06 10:45:00.000    10    
5     2011-06-06 10:50:00.000    10    
4     2011-06-06 10:45:00.000    10    
5     2011-06-06 10:50:00.000    10    
6     2011-06-06 10:55:00.000    10    
7     2011-06-06 11:30:00.000    10    
8     2011-06-06 11:35:00.000    10    
9     2011-06-06 11:40:00.000    10    
10    2011-06-06 11:43:00.000    10    
5     2011-06-06 10:50:00.000    10    
6     2011-06-06 10:55:00.000    10    
7     2011-06-06 11:30:00.000    10    
8     2011-06-06 11:35:00.000    10    
9     2011-06-06 11:40:00.000    10    
10    2011-06-06 11:43:00.000    10    
6     2011-06-06 10:55:00.000    10    
7     2011-06-06 11:30:00.000    10    
8     2011-06-06 11:35:00.000    10    
9     2011-06-06 11:40:00.000    10    
10    2011-06-06 11:43:00.000    10    
11    2011-06-06 11:20:00.000    11 
11    2011-06-06 11:20:00.000    11    
12    2011-06-06 11:30:00.000    11   

1 Ответ

0 голосов
/ 18 августа 2011

Альтернатива I: не поймает одиночную строку 11, так как будет пытаться выбрать самую длинную действительную последовательность из каждой начальной точки.

SELECT C.*
FROM (
    SELECT
        A.UID,
        A.TID AS TID1,
        MAX(B.TID) AS TID2
    FROM TblTask A
    INNER JOIN TblTask B
        ON B.UID = A.UID
        AND B.StartTime BETWEEN A.StartTime AND DATEADD(hour, 1, A.StartTime)
    GROUP BY A.TID, A.UID
    HAVING SUM(B.WId) >= 5 OR COUNT(*) >= 5
) Ranges
INNER JOIN TblTask C
    ON C.UID = Ranges.UID
    AND C.TID BETWEEN Ranges.TID1 AND Ranges.TID2

Альтернатива II: сообщит обоим (4..9)и (4..10), поскольку они подпадают под критерии.

SELECT D.*
FROM (
    SELECT
        A.Uid,
        A.TID AS TID1,
        B.TID AS TID2
    FROM TblTask A
    INNER JOIN TblTask B
        ON B.Uid = A.Uid
        AND B.StartTime BETWEEN A.StartTime AND DATEADD(hour, 1, A.StartTime)
    INNER JOIN TblTask C
        ON C.UID = A.UID
        AND C.TID BETWEEN A.TID AND B.TID
    GROUP BY A.TID, B.TID, A.Uid
    HAVING SUM(C.WId) >= 5  OR COUNT(*) >= 5
) Ranges
INNER JOIN TblTask D
    ON D.Uid = Ranges.Uid
    AND D.TID BETWEEN Ranges.TID1 AND Ranges.TID2;

В любой альтернативе можно добавить столбцы из таблицы Ranges, чтобы различать сцепленные подпоследовательности.

Результат варианта I:

TID   StartTime                 Uid   WId
  1   2011-06-06 09:30:00.000    10   1.5
  2   2011-06-06 09:40:00.000    10   3.5
  3   2011-06-06 09:50:00.000    10   1.0
  3   2011-06-06 09:50:00.000    10   1.0
  4   2011-06-06 10:45:00.000    10   2.5
  5   2011-06-06 10:50:00.000    10   1.5
  4   2011-06-06 10:45:00.000    10   2.5
  5   2011-06-06 10:50:00.000    10   1.5
  6   2011-06-06 10:55:00.000    10   0.0
  7   2011-06-06 11:30:00.000    10   0.0
  8   2011-06-06 11:35:00.000    10   0.0
  9   2011-06-06 11:40:00.000    10   0.0
 10   2011-06-06 11:43:00.000    10   0.0
  5   2011-06-06 10:50:00.000    10   1.5
  6   2011-06-06 10:55:00.000    10   0.0
  7   2011-06-06 11:30:00.000    10   0.0
  8   2011-06-06 11:35:00.000    10   0.0
  9   2011-06-06 11:40:00.000    10   0.0
 10   2011-06-06 11:43:00.000    10   0.0
  6   2011-06-06 10:55:00.000    10   0.0
  7   2011-06-06 11:30:00.000    10   0.0
  8   2011-06-06 11:35:00.000    10   0.0
  9   2011-06-06 11:40:00.000    10   0.0
 10   2011-06-06 11:43:00.000    10   0.0
 11   2011-06-06 11:20:00.000    11   7.0
 12   2011-06-06 11:30:00.000    11   1.0

Результат варианта II:

TID   StartTime                 Uid   WId
  1   2011-06-06 09:30:00.000    10   1.5
  2   2011-06-06 09:40:00.000    10   3.5
  1   2011-06-06 09:30:00.000    10   1.5
  2   2011-06-06 09:40:00.000    10   3.5
  3   2011-06-06 09:50:00.000    10   1.0
  3   2011-06-06 09:50:00.000    10   1.0
  4   2011-06-06 10:45:00.000    10   2.5
  5   2011-06-06 10:50:00.000    10   1.5
  4   2011-06-06 10:45:00.000    10   2.5
  5   2011-06-06 10:50:00.000    10   1.5
  6   2011-06-06 10:55:00.000    10   0.0
  7   2011-06-06 11:30:00.000    10   0.0
  8   2011-06-06 11:35:00.000    10   0.0
  4   2011-06-06 10:45:00.000    10   2.5
  5   2011-06-06 10:50:00.000    10   1.5
  6   2011-06-06 10:55:00.000    10   0.0
  7   2011-06-06 11:30:00.000    10   0.0
  8   2011-06-06 11:35:00.000    10   0.0
  9   2011-06-06 11:40:00.000    10   0.0
  4   2011-06-06 10:45:00.000    10   2.5
  5   2011-06-06 10:50:00.000    10   1.5
  6   2011-06-06 10:55:00.000    10   0.0
  7   2011-06-06 11:30:00.000    10   0.0
  8   2011-06-06 11:35:00.000    10   0.0
  9   2011-06-06 11:40:00.000    10   0.0
 10   2011-06-06 11:43:00.000    10   0.0
  5   2011-06-06 10:50:00.000    10   1.5
  6   2011-06-06 10:55:00.000    10   0.0
  7   2011-06-06 11:30:00.000    10   0.0
  8   2011-06-06 11:35:00.000    10   0.0
  9   2011-06-06 11:40:00.000    10   0.0
  5   2011-06-06 10:50:00.000    10   1.5
  6   2011-06-06 10:55:00.000    10   0.0
  7   2011-06-06 11:30:00.000    10   0.0
  8   2011-06-06 11:35:00.000    10   0.0
  9   2011-06-06 11:40:00.000    10   0.0
 10   2011-06-06 11:43:00.000    10   0.0
  6   2011-06-06 10:55:00.000    10   0.0
  7   2011-06-06 11:30:00.000    10   0.0
  8   2011-06-06 11:35:00.000    10   0.0
  9   2011-06-06 11:40:00.000    10   0.0
 10   2011-06-06 11:43:00.000    10   0.0
 11   2011-06-06 11:20:00.000    11   7.0
 11   2011-06-06 11:20:00.000    11   7.0
 12   2011-06-06 11:30:00.000    11   1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...