Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 COUNT OVER и DISTINCT  [new]
-=FlinT=-
Member

Откуда:
Сообщений: 91
Всем привет.

*MSSQL 2005

Есть небольшая проблема с count(*) over.

Допустим, есть такая табличка:

declare
   @temp table
   (
   Field1 int
   )

insert into @temp values (1)
insert into @temp values (1)
insert into @temp values (1)

insert into @temp values (2)
insert into @temp values (2)
insert into @temp values (2)

Из неё таким образом выбираются данные:

select distinct
   Field1,
   TotalRowsCount = count(*) over (partition by 'all')
from
   @temp

Возвращает оно такие данные:
1 - 6
2 - 6

Вопрос: можно ли как-то переписать без сильных извратов данный запрос, чтобы distinct всё-таки учитывался и count возвращал 2 вместо 6-ти или это невозможно?

Вариант вида:
select
   Field1,
   TotalRowsCount = count(*) over (partition by 'all')
from
   (
   select distinct
      Field1
   from
      @temp
   ) tmp
не интересен :)

Заранее спасибо.
30 окт 09, 17:34    [7864225]     Ответить | Цитировать Сообщить модератору
 Re: COUNT OVER и DISTINCT  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
есть определённый порядок обработки сервером инструкции select
30 окт 09, 17:45    [7864290]     Ответить | Цитировать Сообщить модератору
 Re: COUNT OVER и DISTINCT  [new]
-=FlinT=-
Member

Откуда:
Сообщений: 91
Дедушка
есть определённый порядок обработки сервером инструкции select

Ясно, надо полагать - нельзя.
Хотя.. так категорично.. мало ли что там за кулисами может происходить - над этим определенным порядком обработки :)
30 окт 09, 17:53    [7864343]     Ответить | Цитировать Сообщить модератору
 Re: COUNT OVER и DISTINCT  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
-=FlinT=-,

не уверен что правильно понял Вашу мысль, но проверьте два варианта:
(данные):
+
declare @t table(f int)

insert into @t values (1)
insert into @t values (1)
insert into @t values (1)

insert into @t values (2)
insert into @t values (2)
insert into @t values (2)

insert into @t values (6)
insert into @t values (6)
insert into @t values (6)
insert into @t values (6)
insert into @t values (6)
insert into @t values (6)

insert into @t values (9)

insert into @t values (4)
insert into @t values (4)
insert into @t values (4)
insert into @t values (4)
insert into @t values (4)
insert into @t values (4)
insert into @t values (4)
insert into @t values (4)
insert into @t values (4)

1)
select f,c=max(d)over() from (select f,d=dense_rank()over(order by f) from @t)t
2)
select t.f, t2.c from @t t join (select c=count(distinct f) from @t)t2 on 1=1
30 окт 09, 18:20    [7864459]     Ответить | Цитировать Сообщить модератору
 Re: COUNT OVER и DISTINCT  [new]
-=FlinT=-
Member

Откуда:
Сообщений: 91
Ozzy-Osbourne,

Насчет правильности понятия моей мысли:
клиентскому приложению из базы отдаеться простенький, но достаточно объёмный как по строкам, так и по столбцам рекордсет. Т.е. обычный select без всяких извратов. Для внутренних нужд аппликухи, необходимо также в одном из столбцов рекордсета держать общее кол-во строк этого самого рекордсета. Тот код, что я привел в 1-ом посте: "count(*) over (partition by 'all')" - работает, но, зараза, не учитывает distinct у select-а. Т.е. если select вернул 100 строк, а после distinct-a ужался до 10 строк, "count(*) over" в данном случае вернет всё равно 100 строк. А целью моего поста, было узнать, нет ли какого хитрого индейского способа заставить без особых извратов "count(*) over" учитывать distinct.

Если что, проблем с решением задачи, конечно же не стоит, просто хочеться реализовать по максимуму просто и понятно для будущего суппорта.

select f,c=max(d)over() from (select f,d=dense_rank()over(order by f) from @t)t
select t.f, t2.c from @t t join (select c=count(distinct f) from @t)t2 on 1=1
Выглядит круто, спасибо, но, боюсь, в итоговом select-e будет выглядеть совсем нечитабельно и громоздко, уж лучше тогда вариант в моем 1-ом посте.
30 окт 09, 19:13    [7864627]     Ответить | Цитировать Сообщить модератору
 Re: COUNT OVER и DISTINCT  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
автор
хочеться реализовать по максимуму просто и понятно для будущего суппорта.
ну так прокомментируйте этот код для ваших последователей, и все дела. Не думаю, что у них сильно температура поднимется - не так тут "круто", как это кажется. Заходите в спортзал, там еще и не такое увидите (заодно сами потренируетесь)
30 окт 09, 19:48    [7864763]     Ответить | Цитировать Сообщить модератору
 Re: COUNT OVER и DISTINCT  [new]
-=FlinT=-
Member

Откуда:
Сообщений: 91
Ozzy-Osbourne, спасибо. "Спортзал", не спорю, хорош, да вот только нечасто в него удается походить, к сожалению.
30 окт 09, 20:05    [7864802]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить