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

Откуда:
Сообщений: 37
Добрый день. Возможно вопрос элементарный, но я чего-то в затруднении.
Нужно выбрать минимальное значение из столбца "c" из совпадающих по столбцу "n"
При этом выводиться должен и третий столбец.

n c p
-------------
1 6 post1
2 5 post2
2 6 post3
3 40 post2
4 9 post2

вот этот код не работает:
select * into #tmp from data
SELECT data.n, min(data.c) as min, #tmp.p
from data, #tmp
where data.n=#tmp.n
group by data.n, #tmp.n, #tmp.p
drop table #tmp
6 окт 14, 12:26    [16665367]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Wlr-l
Member

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

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


Результат:
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, 12:37    [16665435]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
drgdr
Member

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

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


Результат:
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, 12:51    [16665539]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Wlr-l
Member

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

with A as (
  select *
    from (values (1,  6, 'post1'),
                 (2,  5, 'post2'),
                 (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 *
  from B
 where c=minC;


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

Откуда:
Сообщений: 522
Wlr-l, Может так?

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

select *
  from B
 where c=minC and cnt>1;


Результат:
n	c	p	minC	cnt
2 5 post2 5 2
6 окт 14, 13:05    [16665640]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
drgdr
Member

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

with A as (
  select *
    from (values (1,  6, 'post1'),
                 (2,  5, 'post2'),
                 (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 *
  from B
 where c=minC;


Результат:
n c p minC
1	6	post1	6
2 5 post2 5
3 40 post2 40
4 9 post2 9


Спасибо, уважаемый!
6 окт 14, 13:05    [16665641]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Lanselot
Member

Откуда:
Сообщений: 76
drgdr,
;WITH t1 as (
	SELECT ROW_NUMBER() OVER(PARTITION by n ORDER BY c ASC) rn, n, c, p 
	FROM @t)

SELECT n,c,p 
FROM t1
where rn = 1
6 окт 14, 13:06    [16665647]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
drgdr
Member

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

спасибо, подошло 16665586
6 окт 14, 13:14    [16665698]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Glory
Member

Откуда:
Сообщений: 104760
drgdr
спасибо, подошло 16665586

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

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

С точки зрения полученного результата min и row_number эквивалентны.
С точки зрения восприятия min предпочтительнее.
С точки зрения планов выполнения row_number предпочтительнее. Это классика.

Поэтому Вам выбирать.
6 окт 14, 13:27    [16665761]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Lanselot
Member

Откуда:
Сообщений: 76
drgdr,
А попробуйте-ка оба варианта на таких данных:
with A as (
  select *
    from (values (1,  6, 'post1'),
                 (2,  5, 'post2'),
                 (2,  6, 'post3'),
                 (3, 40, 'post2'),
                 (3, 20, 'post2'),
                 (3, 20, 'post3'),
                 (4,  9, 'post2')
         ) as T(n, c, p)
)
6 окт 14, 13:49    [16665883]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Lanselot
Member

Откуда:
Сообщений: 76
Wlr-l
С точки зрения полученного результата min и row_number эквивалентны.

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

Откуда:
Сообщений: 104760
Lanselot
Wlr-l
С точки зрения полученного результата min и row_number эквивалентны.

Не согласен.

Не эквивалентны
with A as (
  select *
    from (values (1,  6, 'post1'),
                 (2,  5, 'post2'),
                 (2,  5, 'post2'),
                 (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 n,c,p
  from B
 where c=minC;

;with A as (
  select *
    from (values (1,  6, 'post1'),
                 (2,  5, 'post2'),
                 (2,  5, 'post2'),
                 (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
6 окт 14, 13:56    [16665921]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Wlr-l
Member

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

И что, полученные результаты отличаются? Чем?
6 окт 14, 14:25    [16666065]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Glory
Member

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

И что, полученные результаты отличаются? Чем?

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

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

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

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

можете привести пример?

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

Откуда:
Сообщений: 522
Запрос 1.
with A as (
  select *
    from (values (1,  6, 'post1'),
                 (2,  5, 'post2'),
                 (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 *
  from B
 where c=minC


Запрос 2.
with A as (
  select *
    from (values (1,  6, 'post1'),
                 (2,  5, 'post2'),
                 (2,  6, 'post3'),
                 (3, 40, 'post2'),
                 (4,  9, 'post2')
         ) as T(n, c, p)
)
, B as (
  select *
        ,row_number() over (partition by n order by c) rn
    from A
)

select *
  from B
 where rn=1;



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

Найдите 10 отличий в количестве записей!
6 окт 14, 14:36    [16666145]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Glory
Member

Откуда:
Сообщений: 104760
Wlr-l
Найдите 10 отличий в количестве записей!

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

Откуда:
Сообщений: 522
Glory,
первый случай, когда с Вами должен согласиться.
6 окт 14, 14:42    [16666187]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Lanselot
Member

Откуда:
Сообщений: 76
Wlr-l,
Запрос 1. - Возвращает все строки с минимальными значениями для группы
Запрос 2. - Возвращает только одну строку для группы.

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

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

1.Да в этом плане запросы разные, признаю.

2.ROW_NUMBER я уже сказал, что это классика.
6 окт 14, 14:58    [16666330]     Ответить | Цитировать Сообщить модератору
 Re: минимальное значение в столбце с объединением по соседнему столбцу  [new]
Glory
Member

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

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

Откуда:
Сообщений: 37
Glory
drgdr
спасибо, подошло 16665586

а производительнсоть вас совсем не итересует ?


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

Откуда:
Сообщений: 522
drgdr,
Используйте row_number. Так будет правильнее. Если min, то придется добавить еще distinct.

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