Что не так с этим разделом - PullRequest
0 голосов
/ 27 декабря 2010

У меня есть запрос, который использует секцию по столбцу времени, однако результат немного неожиданный, что здесь не так? Почему я получаю более одного 1 на RN? (один на 21: 00: 02: 100, а другой на 21: 00: 02: 600)

SELECT TOP 500
    ROW_NUMBER() OVER(
                PARTITION BY [Date], CAST([Time] AS Time(0))
                ORDER BY [DATE] ASC, CAST([Time] AS Time(0)) ASC
               ) RN,
               [DATE],
               [Time]               
FROM [DB]..[TABLE]
ORDER BY [Date] ASC,
         [Time] ASC,
         [RN] ASC

Результаты:

**1 2010-10-03  21:00:02.100**
2   2010-10-03  21:00:02.100
3   2010-10-03  21:00:02.200
4   2010-10-03  21:00:02.200
5   2010-10-03  21:00:02.200
4   2010-10-03  21:00:02.500
**1 2010-10-03  21:00:02.600**
2   2010-10-03  21:00:02.600
3   2010-10-03  21:00:02.600
5   2010-10-03  21:00:02.700
6   2010-10-03  21:00:02.700
7   2010-10-03  21:00:02.700
8   2010-10-03  21:00:02.700
9   2010-10-03  21:00:02.700
10  2010-10-03  21:00:02.700
11  2010-10-03  21:00:02.700
12  2010-10-03  21:00:02.700
13  2010-10-03  21:00:02.700
14  2010-10-03  21:00:02.700
15  2010-10-03  21:00:02.700
16  2010-10-03  21:00:02.700
17  2010-10-03  21:00:02.700
18  2010-10-03  21:00:02.700
19  2010-10-03  21:00:02.700
20  2010-10-03  21:00:02.700
21  2010-10-03  21:00:02.700
22  2010-10-03  21:00:02.700

Ответы [ 2 ]

2 голосов
/ 27 декабря 2010

Вы используете CASTing к time(0) для своего заказа, который округляет (усекает?) Время до второй точности.Он работает точно так, как рекламируется ...

Редактировать:

Нет смысла иметь одинаковые PARTITION BY и ORDER BY ...

Я думаю, что выпытаемся разделить по секундам и хотим, чтобы номера строк в этом интервале

Попробуйте:

ROW_NUMBER() OVER(
            PARTITION BY [Date], CAST([Time] AS Time(0))
            ORDER BY [DATE], [Time]
           ) RN

Если вы получаете дубликаты номеров строк, пересекающих границу 0,5 секунды, используйте это для принудительного усеченияа не КРУГЛЫЙ

ROW_NUMBER() OVER(
            PARTITION BY [Date], CAST([Time] - '00:00:00.5000' AS Time(0))
            ORDER BY [DATE], [Time]
           ) RN
0 голосов
/ 31 декабря 2010

Большое спасибо за ваш отзыв, оказалось, что приведение округляет его и, следовательно, он не работает (дает мне два раза 1). Вычитание из [ВРЕМЯ] не работает для меня, получил ошибку. В конце я использовал этот код, чтобы заставить его работать как хотелось:

ROW_NUMBER() OVER( PARTITION BY CONVERT(nvarchar(8), [Time], 8) ORDER BY [Date], [Time]) RN FROM [DB]..[TABLE]

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