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

Откуда:
Сообщений: 81
Wlr-l
drgdr,
Используйте row_number.

Мне нужно выводить все, а вариант с row_number выдает только 1 из самых дешевых.
6 окт 14, 15:15    [16666476]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Glory
Member

Откуда:
Сообщений: 104751
drgdr
а вариант с row_number выдает только 1 из самых дешевых.

А кроме row_number есть еще другие функция ранжирования
6 окт 14, 15:22    [16666521]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Wlr-l
Member

Откуда:
Сообщений: 599
drgdr,

"нужно выводить все минимальные (это я не предусмотрел изначально)", "Мне нужно выводить все, а вариант с row_number выдает только 1 из самых дешевых". Т.е. до сих пор задача не определена.

Наверно, нужно еще раз описать полностью задачу, привести исходные данные, отражающие характерные варианты и привести желаемый результат. Потому что из Вашего описания задачи и Вашего запроса я понял, что нужно так:

Результат:
n	c	p	(No column name)
1 6 post1 6
2 6 post3 5
2 5 post2 5
3 40 post2 40
4 9 post2 9
6 окт 14, 15:30    [16666627]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
drgdr
Member

Откуда:
Сообщений: 81
Glory
А кроме row_number есть еще другие функция ранжирования

Если Вы говорите про DENSE_RANK, то получается так:

with tmp as (
select *
,DENSE_RANK() OVER (partition by n order by c) rn
from data
)

select *
from tmp
where rn=1
6 окт 14, 15:34    [16666701]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Glory
Member

Откуда:
Сообщений: 104751
drgdr
то получается так:

И что на этот раз неправильно ?
6 окт 14, 15:35    [16666710]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Wlr-l
Member

Откуда:
Сообщений: 599
drgdr,
Если использовать такие данные, то какой результат будет правильным?
with A as (
  select *
    from (values (1,  6, 'post1'),
                 (2,  5, 'post2'),
                 (2,  5, 'post3'),
                 (2,  6, 'post3'),
                 (3, 40, 'post2'),
                 (4,  9, 'post2')
         ) as T(n, c, p)
)
, B as (
  select *
        ,min(c) over (partition by n) minC
    from A
)

select distinct n,c,p
  from B
 where c=minC;

;with A as (
  select *
    from (values (1,  6, 'post1'),
                 (2,  5, 'post2'),
                 (2,  5, 'post3'),
                 (2,  6, 'post3'),
                 (3, 40, 'post2'),
                 (4,  9, 'post2')
         ) as T(n, c, p)
)
SELECT n,c,p 
from(
	SELECT ROW_NUMBER() OVER(PARTITION by n ORDER BY c ASC) rn, n, c, p 
	FROM A
	) t1
where rn = 1


Результат запроса 1:
n	c	p
1 6 post1
2 5 post2
2 5 post3
3 40 post2
4 9 post2

Результат запроса 2:
n	c	p
1 6 post1
2 5 post3
3 40 post2
4 9 post2

Как видим, что не все так очевидно и однозначно.
6 окт 14, 15:38    [16666741]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
drgdr
Member

Откуда:
Сообщений: 81
Glory
И что на этот раз неправильно ?

Просто не был знаком с этой функцией. На нескольких примерах с ней получился нужный ответ. Решил уточнить правильно ли я понял.
6 окт 14, 15:39    [16666749]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
drgdr
Member

Откуда:
Сообщений: 81
Wlr-l
drgdr,
Если использовать такие данные, то какой результат будет правильным?
...
Как видим, что не все так очевидно и однозначно.


Да, мне нужен результат как в первом примере, но так как min - это долго, думаю правильнее использовать DENSE_RANK()
6 окт 14, 15:42    [16666766]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Wlr-l
Member

Откуда:
Сообщений: 599
drgdr,

Вас напугали производительностью. Эти запросы примерно одинаковые по производительности (см. планы выполнения).
С мин больше квадратиков, но это не так страшно. На нескольких миллионах строк Вы не заметите разницу.
6 окт 14, 15:52    [16666828]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Wlr-l
Member

Откуда:
Сообщений: 599
Glory,

Наверно, я слишком рано согласился с Вами.
6 окт 14, 15:53    [16666838]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Glory
Member

Откуда:
Сообщений: 104751
Wlr-l
я слишком рано согласился с Вами.

Т.е. вы будете настаивать, что запросы эквивалентны ?
6 окт 14, 15:55    [16666848]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Wlr-l
Member

Откуда:
Сообщений: 599
Wlr-l,
Если во втором запросе окно описать так:

	SELECT ROW_NUMBER() OVER(PARTITION by n,p ORDER BY c ASC) rn, n, c, p 

, то запросы дадут одинаковый результат.
6 окт 14, 15:56    [16666859]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Wlr-l
Member

Откуда:
Сообщений: 599
Glory,
Нет, в том, что условия задачи конкретизировались позже.
6 окт 14, 15:57    [16666865]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Glory
Member

Откуда:
Сообщений: 104751
Wlr-l
, то запросы дадут одинаковый результат.

Вы уверены ? Проверили на всех возможных вариантах данных ?
6 окт 14, 15:58    [16666879]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Glory
Member

Откуда:
Сообщений: 104751
Wlr-l
Glory,
Нет, в том, что условия задачи конкретизировались позже.

А это кто-то оспаривал ?
6 окт 14, 15:59    [16666882]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Wlr-l
Member

Откуда:
Сообщений: 599
Glory,

Скорее нет. Но Вы повторили пример автора варианта с ROW_NUMBER, и не заметили что могут быть и такие данные:
    from (values (1,  6, 'post1'),
                 (2,  5, 'post2'),
                 (2,  5, 'post3'),
                 (2,  6, 'post3'),
                 (3, 40, 'post2'),
                 (4,  9, 'post2')


а на этих данный мой запрос с мин решает задачу, а с ROW_NUMBER не решает.
В первом случает требуется удаление дубликатов, а во втором изменить определение окна.
6 окт 14, 16:05    [16666920]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Glory
Member

Откуда:
Сообщений: 104751
Wlr-l
а на этих данный мой запрос с мин решает задачу, а с ROW_NUMBER не решает.

Вообще-то разговор был про вашу фразу об эквивалентности запросов.
Было показано, что запросы неэквивалентны.
Никто не говорит, что, переписав запросы, можно сделать их эквивалентными.
6 окт 14, 16:07    [16666932]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Lanselot
Member

Откуда:
Сообщений: 76
drgdr
Нужно выбрать минимальное значение из ...


Если "минимальное" - то наверное одно и единственное?
Просто ТС изначально неверно описал условия конечной задачи.
6 окт 14, 16:12    [16666962]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Wlr-l
Member

Откуда:
Сообщений: 599
Glory,

Точно также методом последовательного приближения решить задачу. Как видим потребовалось несколько вариантов запросов, чтобы понять, что нужно было на самом деле.
6 окт 14, 16:12    [16666966]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Glory
Member

Откуда:
Сообщений: 104751
Wlr-l
Glory,

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

Я про это "С точки зрения полученного результата min и row_number эквивалентны." 16665761
А ыы про что?
6 окт 14, 16:15    [16666982]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Wlr-l
Member

Откуда:
Сообщений: 599
Glory,

Можете проверить:

with A as (
  select *
    from (values (1,  6, 'post1'),
                 (2,  5, 'post2'),
                 (2,  5, 'post2'),
                 (2,  5, 'post3'),
                 (2,  6, 'post3'),
                 (3, 40, 'post2'),
                 (4,  9, 'post2')
         ) as T(n, c, p)
)
, B as (
  select *
        ,min(c) over (partition by n) minC
    from A
)

select distinct n,c,p
  from B
 where c=minC;

;with A as (
  select *
    from (values (1,  6, 'post1'),
                 (2,  5, 'post2'),
                 (2,  5, 'post2'),
                 (2,  5, 'post3'),
                 (2,  6, 'post3'),
                 (3, 40, 'post2'),
                 (4,  9, 'post2')
         ) as T(n, c, p)
)
SELECT n,c,p 
from(
	SELECT ROW_NUMBER() OVER(PARTITION by n,p ORDER BY c ASC) rn, n, c, p 
	FROM A
	) t1
where rn = 1


Результат одного и другого:
n	c	p
1 6 post1
2 5 post2
2 5 post3
3 40 post2
4 9 post2
6 окт 14, 16:18    [16666997]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Wlr-l
Member

Откуда:
Сообщений: 599
Glory,

Про то, что ни первый, ни второй запрос не решили исходной задачи. Но в первом случае есть дубликаты, во втором случае - нет нужных строк. Так какой запрос более правильный?
6 окт 14, 16:20    [16667007]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Glory
Member

Откуда:
Сообщений: 104751
Wlr-l
Можете проверить:

Слушайте. Хватит прикидываться.
Вы ПЕРЕписали запрос.
С учетом много раз измененной формулировки задачи.
Дочитайте ДО указанного поста. И докажите _на тот момент_ времени, что запросы эквивалентны.
6 окт 14, 16:20    [16667012]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Glory
Member

Откуда:
Сообщений: 104751
Wlr-l
Glory,

Про то, что ни первый, ни второй запрос не решили исходной задачи. Но в первом случае есть дубликаты, во втором случае - нет нужных строк. Так какой запрос более правильный?

А причем тут "я слишком рано согласился с Вами" ?
Что и кому вы хотите доказать ?
Что "распределение" - это уникальная задача ?
6 окт 14, 16:22    [16667023]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Wlr-l
Member

Откуда:
Сообщений: 599
Glory,
Да переписал оба запроса, чтобы решить исходную задачу.

Не будьте злопамятны, потому что и я такой. Тогда Вы не смогли помощь человеку получить данные для гистограммы.
6 окт 14, 16:27    [16667046]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить