Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Помогите решить задачу используя COUNT...OVER...  [new]
igor888
Guest
Добрый день.

накидал простенький запрос

DECLARE @Category TABLE(
  [Key]	INT,
  [Date] NVARCHAR(50),
  [Event] NVARCHAR(50),
  [Cost] MONEY
)

INSERT INTO @Category VALUES (1, '07.07.2015', 'Событие 1', 800)
INSERT INTO @Category VALUES (1, '07.07.2015', 'Событие 2', 650)
INSERT INTO @Category VALUES (1, '07.07.2015', 'Событие 3', 650)
INSERT INTO @Category VALUES (1, '08.07.2015', 'Событие 1', 800)
INSERT INTO @Category VALUES (1, '08.07.2015', 'Событие 2', 650)


SELECT *, COUNT(*) OVER (PARTITION BY [Key]) AS [AmountDates] FROM @Category


Как посчитать количество дней? на данный момент считает 5, а должно быть 2.

Использую MSSQL2008 R2
8 июл 15, 14:34    [17867636]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
igor888,

кто-то надоумил дату в строке хранить?
Однако, COUNT(DISTINCT ...)OVER() MS не реализовал, так что не так просто, как могло бы быть.
К тому же неясно, надо посчитать сколько разных дат существует для Key,
или продолжительность периода времени для Key в днях?
8 июл 15, 14:40    [17867674]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
_djХомяГ
Guest
Ну без OVER а с сабквери
SELECT *, (select COUNT(distinct Date) from @Category ) FROM @Category
8 июл 15, 14:44    [17867704]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
хе-хе )
Guest
;WITH x AS (SELECT DISTINCT [Key], Date  FROM @Category) 
SELECT *, COUNT(*) OVER (PARTITION BY [Key]) AS [AmountDates] FROM x
8 июл 15, 14:47    [17867719]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
igor888
Guest
iap,

"COUNT(DISTINCT ...)OVER() MS не реализовал" - в яблочко!

Дата тут не причём, можно и другой пример привести
Нужно посчитать количество разных вариантов [Date] для [Key].
8 июл 15, 14:47    [17867723]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
igor888
iap,

"COUNT(DISTINCT ...)OVER() MS не реализовал" - в яблочко!

Дата тут не причём, можно и другой пример привести
Нужно посчитать количество разных вариантов [Date] для [Key].
Однако, про период времени вместо количества - ни слова.
А можно в принципе MAX()OVER()-MIN(OVER()+1
8 июл 15, 14:49    [17867742]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
Кролик-зануда
Guest
igor888,

max от dense_rank вам в помощь :)
8 июл 15, 14:55    [17867774]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
igor888
Guest
iap
igor888
iap,

"COUNT(DISTINCT ...)OVER() MS не реализовал" - в яблочко!

Дата тут не причём, можно и другой пример привести
Нужно посчитать количество разных вариантов [Date] для [Key].
Однако, про период времени вместо количества - ни слова.
А можно в принципе MAX()OVER()-MIN(OVER()+1


Что-то непонятное... а как это будет выглядеть касаемо моего примера... добавь плж нужный скрипт в мой пример
8 июл 15, 14:55    [17867782]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
igor888
Guest
_djХомяГ
Ну без OVER а с сабквери
SELECT *, (select COUNT(distinct Date) from @Category ) FROM @Category


Не подойдёт... боевой запрос собирается из нескольких UNION'ов...
8 июл 15, 14:58    [17867798]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
igor888, условия игры меняются в процессе игры? :)
8 июл 15, 15:03    [17867823]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
Кролик-зануда
Guest
Кролик-зануда
igor888,

max от dense_rank вам в помощь :)


для вашего примера

select [Key],[Date],[Event],[Cost],MAX(r)over(partition by [Key]) AS [AmountDates] 
  from (SELECT *, dense_rank()OVER (PARTITION BY [Key] order by [Date])r  FROM @Category)c
8 июл 15, 15:07    [17867845]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
DECLARE @Category TABLE(
  [Key]	INT,
  [Date] NVARCHAR(50),
  [Event] NVARCHAR(50),
  [Cost] MONEY
)

INSERT INTO @Category VALUES (1, '07.07.2015', 'Событие 1', 800);
INSERT INTO @Category VALUES (1, '07.07.2015', 'Событие 2', 650);
INSERT INTO @Category VALUES (1, '07.07.2015', 'Событие 3', 650);
INSERT INTO @Category VALUES (1, '08.07.2015', 'Событие 1', 800);
INSERT INTO @Category VALUES (1, '08.07.2015', 'Событие 2', 650);


WITH CTE AS(SELECT D=CONVERT(DATE,[Date],104),* FROM @Category)
SELECT *, DATEDIFF(DAY,MIN(D)OVER(PARTITION BY [Key]),MAX(D)OVER(PARTITION BY [Key]))+1 AS [AmountDates]
FROM CTE;

CTE только из-за того, что даты хранятся в дурацком строковом формате
и сортируются в неправильном порядке.
8 июл 15, 15:09    [17867852]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
igor888
Guest
Владислав Колосов
igor888, условия игры меняются в процессе игры? :)


Умно!
У меня единственный вариант, создать табличную переменную, запихать туда данные, и воспользоваться субквери, как написал _djХомяГ?
8 июл 15, 15:09    [17867854]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Кролик-зануда
Кролик-зануда
igor888,

max от dense_rank вам в помощь :)


для вашего примера

select [Key],[Date],[Event],[Cost],MAX(r)over(partition by [Key]) AS [AmountDates] 
  from (SELECT *, dense_rank()OVER (PARTITION BY [Key] order by [Date])r  FROM @Category)c
Серьёзная ошибочка вышла! Сюрприз!!!
Строка [Date]-то, оказывается, возрастает совсем не так, как соответствующие даты!
8 июл 15, 15:11    [17867868]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
Кролик-зануда
Guest
iap,

и на чем это должно сказываться?
8 июл 15, 15:11    [17867871]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
igor888
Guest
iap,

Плохо я тестовые примеры привожу)))
как писал ранее дата не имеет значения, переделываю

DECLARE @Category TABLE(
  [Key]	INT,
  [Type] NVARCHAR(50),
  [Event] NVARCHAR(50),
  [Cost] MONEY
)

INSERT INTO @Category VALUES (1, 'Тип 1', 'Событие 1', 800)
INSERT INTO @Category VALUES (1, 'Тип 1', 'Событие 2', 650)
INSERT INTO @Category VALUES (1, 'Тип 1', 'Событие 3', 650)
INSERT INTO @Category VALUES (1, 'Тип 2', 'Событие 1', 800)
INSERT INTO @Category VALUES (1, 'Тип 2', 'Событие 2', 650)


SELECT *, COUNT(*) OVER (PARTITION BY [Key]) AS [AmountType] FROM @Category


как получить 2 вместо 5-ти AmountType?
8 июл 15, 15:12    [17867875]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Кролик-зануда
iap,

и на чем это должно сказываться?
Да, у Вас ни на чём. Это у меня сказалось бы...
Сумимасен.
8 июл 15, 15:12    [17867876]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
Кролик-зануда
Guest
igor888
как получить 2 вместо 5-ти AmountType?

+
select isnull(nullif(AmountType,5),2)




а если вы научитесь читать все сообщения, а не только последнее, то увидите, что решение для вашей задачи уже озвучено ;)

iap,

бывает...
8 июл 15, 15:18    [17867904]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Тотоже вариант с подзапросом но друго виду
select COUNT(x.a)
from (

select distinct COUNT(*)over(partition by [type] order by [key]) as a, [key], [type] from @Category
)x
8 июл 15, 15:34    [17867986]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
igor888
Guest
Кролик-зануда
Кролик-зануда
igor888,

max от dense_rank вам в помощь :)


для вашего примера

select [Key],[Date],[Event],[Cost],MAX(r)over(partition by [Key]) AS [AmountDates] 
  from (SELECT *, dense_rank()OVER (PARTITION BY [Key] order by [Date])r  FROM @Category)c


Огромное спасибо, то что надо!
8 июл 15, 15:45    [17868052]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
SELECT [Key], [Type], [Event], [Cost], COUNT(case when rn = 1 then 1 end) OVER (PARTITION BY [Key]) AS [AmountType]
FROM
 (select *, row_number() over (partition by [Key], [Type] order by (select 1)) as rn from @Category) t
8 июл 15, 15:51    [17868092]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
igor888
Guest
invm
SELECT [Key], [Type], [Event], [Cost], COUNT(case when rn = 1 then 1 end) OVER (PARTITION BY [Key]) AS [AmountType]
FROM
 (select *, row_number() over (partition by [Key], [Type] order by (select 1)) as rn from @Category) t


Так же работает))))

Если на вскидку, что что оптимальней использовать? вариант с dense_rank() или с row_number() ?
8 июл 15, 16:46    [17868424]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
igor888
Guest
invm,

Ещё маленький вопросик,
а как вытащить общее количество [Type] по всем [Key]?

из примера, общее количество должно быть 3.
8 июл 15, 16:59    [17868488]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
igor888
Как посчитать количество дней? на данный момент считает 5, а должно быть 2.

Использую MSSQL2008 R2


Загляните сюда

https://www.sql.ru/forum/1146528/okonnyy-distinct-count?hl=??????? distinct
8 июл 15, 18:06    [17868876]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу используя COUNT...OVER...  [new]
igor888
Guest
invm,

Стал сравнивать 2 варианта, странно, но твой вариант надёжнее (некоторых случаях), выдаёт гарантированно верные значения.
Ещё раз спасибо, со всем разобрался, вопрос закрыт!
8 июл 15, 18:16    [17868933]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить