Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста / 25 сообщений из 28, страница 1 из 2
26.10.2017, 11:19
    #39542241
myrzilka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
Добрый день.
Есть запрос вида

SELECT top 2 with ties ROW_NUMBER() OVER (PARTITION BY Продукт ORDER BY Цена DESC) AS N , * FROM
table1
where Продукт in ('Продукт 1', 'Продукт 2')
order by ROW_NUMBER() OVER (PARTITION BY Организация ORDER BY COUNT(Цена) DESC)

Но результат всё равно выдает по одной строке на каждый продукт. Если поставить TOP 6 - выдает по 3 строки.
Как сделать запрос, чтобы результат был по 2 или более ROW_NUMBER() для каждого продукта?
...
Рейтинг: 0 / 0
26.10.2017, 11:25
    #39542246
myrzilka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
Прошу прощения опечатка..

Добрый день.
Есть запрос вида

SELECT top 2 with ties ROW_NUMBER() OVER (PARTITION BY Продукт ORDER BY Цена DESC) AS N , * FROM
table1
where Продукт in ('Продукт 1', 'Продукт 2')
order by ROW_NUMBER() OVER (PARTITION BY Продукт ORDER BY Цена DESC)

Но результат всё равно выдает по одной строке на каждый продукт. Если поставить TOP 6 - выдает по 3 строки.
Как сделать запрос, чтобы результат был по 2 или более ROW_NUMBER() для каждого продукта?
...
Рейтинг: 0 / 0
26.10.2017, 11:25
    #39542247
LoopN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
select * from
(
SELECT top 2 with ties ROW_NUMBER() OVER (PARTITION BY Продукт ORDER BY Цена DESC) AS N , * FROM
table1
where Продукт in ('Продукт 1', 'Продукт 2')
) z
where N <3
...
Рейтинг: 0 / 0
26.10.2017, 11:26
    #39542248
LoopN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
Код: sql
1.
2.
3.
4.
5.
6.
7.
select * from
(
SELECT ROW_NUMBER() OVER (PARTITION BY Продукт ORDER BY Цена DESC) AS N , * FROM
table1
where Продукт in ('Продукт 1', 'Продукт 2')
) z
where N <3 
...
Рейтинг: 0 / 0
26.10.2017, 11:37
    #39542266
myrzilka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
LoopN, в этом случае не сработает 'with ties', а это важно в моем случае.

Если написать

select * from
(
SELECT ROW_NUMBER() OVER (PARTITION BY Продукт ORDER BY Цена DESC) AS N , * FROM
table1
where Продукт in ('Продукт 1', 'Продукт 2')
) z
where N <3


то получим только те записи, у которых ROW_NUMBER() = 3, а with ties дал бы результат всех записей, у которых цена такая же как и у ROW_NUMBER() = 3
...
Рейтинг: 0 / 0
26.10.2017, 12:34
    #39542348
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
myrzilka,

Словами опишите, что должно быть на выходе.
TOP(2) WITH TIES вам не подойдёт - печёнкой чую! Но надо убедиться после ваших разъяснений.

Например, один продукт (PARTITION BY Продукт) может иметь две и более цены? Как это?
...
Рейтинг: 0 / 0
26.10.2017, 13:20
    #39542398
o-o
o-o
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
iapНапример, один продукт (PARTITION BY Продукт) может иметь две и более цены? Как это?
ну например там еще есть колонка "модель" или "сорт".
и вот у него есть продукт = яблоко, сортов аж 10, из них только у 5ти одинаковая цена.
и хочет он вывести 2 любых самых дорогих, но именно яблок.
т.е. из 5 сортов по одной и той же цене вывести только 2(первые попавшиеся?).
и то же самое для продукта "груша"
---
уж собрать тестовую табличку с 3 полями и десятком строк наверное дело 5ти минут
...
Рейтинг: 0 / 0
26.10.2017, 13:24
    #39542404
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
o-oи вот у него есть продукт = яблоко, сортов аж 10, из них только у 5ти одинаковая цена.
и хочет он вывести 2 любых самых дорогих, но именно яблок.
т.е. из 5 сортов по одной и той же цене вывести только 2(первые попавшиеся?).
и то же самое для продукта "груша"
Хуже. Он хочет получить как минимум первые 2 самые дорогие, причём если есть ещё записи, цена в которых равна цене второй записи - получить и их тоже.
...
Рейтинг: 0 / 0
26.10.2017, 13:34
    #39542416
o-o
o-o
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
а, ну да, тогда все логично:
2 самых дорогих "яблок" со всеми видами-подвидами.
---
почему бы не сложить свои 'Продукт 1', 'Продукт 2' хотя бы даже в табличную переменную
и прилепить к ним стоки из top 2 with ties через cross apply?
...
Рейтинг: 0 / 0
26.10.2017, 13:36
    #39542418
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
myrzilka, похоже на экзамен на знание старых тем на форуме Недавно такую задачу решали.

Код: sql
1.
2.
3.
4.
SELECT top 1 with ties ROW_NUMBER() OVER (PARTITION BY Продукт ORDER BY Цена DESC) AS N , * 
FROM table1
where Продукт in ('Продукт 1', 'Продукт 2')
order by (row_number() OVER (PARTITION BY Продукт ORDER BY Цена DESC)-1) / 2
...
Рейтинг: 0 / 0
26.10.2017, 13:40
    #39542422
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
ошибся слегка, вот так больше похоже:

Код: sql
1.
2.
3.
4.
SELECT top 1 with ties * 
from table1
where Продукт in ('Продукт 1', 'Продукт 2')
order by (rank() OVER (PARTITION BY Продукт ORDER BY Цена DESC)-1) / 2
...
Рейтинг: 0 / 0
26.10.2017, 13:47
    #39542434
myrzilka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
Похоже, это то, что нужно! Спасибо большое!
...
Рейтинг: 0 / 0
26.10.2017, 13:59
    #39542451
o-o
o-o
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
и что получается в результате?
вот на таких данных получили 3 вида яблок по самой дорогой цене (и где тут топ 2 цен для яблока?)
и 2 вида груш (тут ок, 2 цены вышло)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare @t table(prod_id int, price int, model int);
insert into @t values 
(1, 40, 1), (1, 40, 2), (1, 40, 3), (1, 20, 1), (1, 30, 1), 
(2, 10, 1), (2, 30, 2), (2, 40, 3), (2, 50, 4), (2, 60, 5),
(3, 10, 1), 
(4, 15, 1)


SELECT top 1 with ties * 
from @t
where prod_id in (1,2)
order by (rank() OVER (PARTITION BY prod_id ORDER BY price DESC)-1) / 2
...
Рейтинг: 0 / 0
26.10.2017, 14:07
    #39542462
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
o-oи что получается в результате?
вот на таких данных получили 3 вида яблок по самой дорогой цене (и где тут топ 2 цен для яблока?)
и 2 вида груш (тут ок, 2 цены вышло)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare @t table(prod_id int, price int, model int);
insert into @t values 
(1, 40, 1), (1, 40, 2), (1, 40, 3), (1, 20, 1), (1, 30, 1), 
(2, 10, 1), (2, 30, 2), (2, 40, 3), (2, 50, 4), (2, 60, 5),
(3, 10, 1), 
(4, 15, 1)


SELECT top 1 with ties * 
from @t
where prod_id in (1,2)
order by (rank() OVER (PARTITION BY prod_id ORDER BY price DESC)-1) / 2


запрос сделан с расчетом на постановку, что нужно получить минимум 2 модели с самыми высокими целями - тогда результат достигнут.
Для вашей постановки (все модели с 2 самыми высокими ценами) нужно использовать dense_rank.
...
Рейтинг: 0 / 0
26.10.2017, 14:08
    #39542464
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
Minamotoзапрос сделан с расчетом на постановку, что нужно получить минимум 2 модели с самыми высокими целями ценами- тогда результат достигнут.
Для вашей постановки (все модели с 2 самыми высокими ценами) нужно использовать dense_rank.
...
Рейтинг: 0 / 0
26.10.2017, 14:10
    #39542467
myrzilka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
у меня при таком запросе вообще у всех одинаковый rank ставится и выводятся все значения.

Поясню еще раз, что нужно.
Есть яблоки, груши, помидоры... у них могут быть виды - красное, белое, зеленое. У каждого вида своя цена. Яблок и груш n- ное количество.
Надой найти top 2 тех овощей или фруктов, у которых сумма со всеми подвидами наибольшая. Но при этом в результате запросам надо получить такие столбцы

N Фрукт/Овощ Вид Кол-во
1 Яблоки Красное 45
2 Груши Белое 41
3 Яблоки Зеленое 14
4 Помидоры Красное 13

Но в данном случае получаем не совсем правильную сортировку, т.к. Яблоки считаются два раза (из-за того, что мы выводим и виды тоже).

Не знаю, может вообще так нельзя сделать...
...
Рейтинг: 0 / 0
26.10.2017, 14:15
    #39542472
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
myrzilkaу меня при таком запросе вообще у всех одинаковый rank ставится и выводятся все значения.

Поясню еще раз, что нужно.
Есть яблоки, груши, помидоры... у них могут быть виды - красное, белое, зеленое. У каждого вида своя цена. Яблок и груш n- ное количество.
Надой найти top 2 тех овощей или фруктов, у которых сумма со всеми подвидами наибольшая. Но при этом в результате запросам надо получить такие столбцы

N Фрукт/Овощ Вид Кол-во
1 Яблоки Красное 45
2 Груши Белое 41
3 Яблоки Зеленое 14
4 Помидоры Красное 13

Но в данном случае получаем не совсем правильную сортировку, т.к. Яблоки считаются два раза (из-за того, что мы выводим и виды тоже).

Не знаю, может вообще так нельзя сделать...
Мда, понятнее не стало. Дайте первоначальное наполнение - приведите код создания и заполнения тестовых таблиц, и определение, что вы понимаете под "суммой с подвидами". А то в запросе у вас только цена фигурирует, а в этом объяснении внезапно количество появляется.
...
Рейтинг: 0 / 0
26.10.2017, 14:16
    #39542475
o-o
o-o
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
из его постановки задачи конечно вообще непонятно, что надо.
но слова минимум там точно нет.
меня просто удивила неконсистентность результата в том плане,
что для одного продукта вываливает всего 1 цену, для второго две.

с вашей формулировкой конечно понятнее
...
Рейтинг: 0 / 0
26.10.2017, 14:18
    #39542478
o-o
o-o
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
myrzilkaНадой найти top 2 тех овощей или фруктов, у которых сумма со всеми подвидами наибольшая.
теперь уже сумма вылезла.
а где же она считается в первом посте?
да вообще по-моему впервые появилась ближе к концу обсуждения...
...
Рейтинг: 0 / 0
26.10.2017, 14:25
    #39542491
myrzilka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
o-o,
сумма - имеется ввиду "Количество".

Яблоки должны быть в top, потому что в сумме их больше всех - 59, а сейчас выводятся груши в топ.

rank Фрукт/Овощ Вид Кол-во
1 Груши Белое 50
2 Яблоки Красное 45
3 Яблоки Зеленое 14
4 Помидоры Красное 13
...
Рейтинг: 0 / 0
26.10.2017, 14:30
    #39542501
o-o
o-o
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
час от часу не легче.
сперва в запросе была цена, потом она ушла и не вернулась.
зато вылезло Количество, а где оно в первоначальном запросе?
авторсумма - имеется ввиду "Количество".

Яблоки должны быть в top, потому что в сумме их больше всех - 59
так все-таки сумма есть?
или я чего-то не вижу строку с Количество = 59.
зато вижу 45 + 14!!!
...
Рейтинг: 0 / 0
26.10.2017, 14:36
    #39542510
myrzilka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
o-o,
да, я имею виду именно 45-14 :) (простите за сумбурность).
Вопрос - можно ли как-то присвоить Яблокам одинаковый Rank ?
Чтобы, когда я напишу в итоге вывести значения, у которых Rank >= 2 , то отобралось бы 3 строки - Груши и два Яблока.
...
Рейтинг: 0 / 0
26.10.2017, 14:52
    #39542532
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
myrzilka,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
with a as
(
 select
  N, [Фрукт/Овощ], [Вид], [Кол-во],
  sum([Кол-во]) over(partition by [Фрукт/Овощ]) as s
 from
  [Таблица]
),
b as
(
 select
  N, [Фрукт/Овощ], [Вид], [Кол-во],
  dense_rank() over (order by s desc) as r
 from
  a
)
select
 N, [Фрукт/Овощ], [Вид], [Кол-во]
from
 b
where
 r < 3;
...
Рейтинг: 0 / 0
26.10.2017, 14:54
    #39542533
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
myrzilka, это, что ли, хотите?

Код: sql
1.
2.
3.
4.
SELECT table1.* 
from    table1
        inner join (select top 2 [Продукт] from table1 group by [Продукт] order by count([Количество]) desc) as table2
                on table1.[Продукт] = table2.[Продукт]
...
Рейтинг: 0 / 0
26.10.2017, 14:55
    #39542535
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста
Minamotomyrzilka, это, что ли, хотите?

Код: sql
1.
2.
3.
4.
SELECT table1.* 
from    table1
        inner join (select top 2 [Продукт] from table1 group by [Продукт] order by count([Количество]) desc) as table2
                on table1.[Продукт] = table2.[Продукт]


Код: sql
1.
2.
3.
4.
SELECT table1.* 
from    table1
        inner join (select top 2 [Продукт] from table1 group by [Продукт] order by sum([Количество]) desc) as table2
                on table1.[Продукт] = table2.[Продукт]
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Top 2 with ties (Некорректный результат запроса).Помогите, пожалуйста / 25 сообщений из 28, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]