powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / помогите написать запрос или подскажите где почитать
15 сообщений из 15, страница 1 из 1
помогите написать запрос или подскажите где почитать
    #40103575
dsalodki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть таблица
CREATE TABLE [dbo].[Tournament](
[Player_ID] [int] NOT NULL,
[Game_ID] [int] NOT NULL,
[Points] [int] NOT NULL,
[Date] [date] NOT NULL,
[Period_ID] [int] NOT NULL
) ON [PRIMARY]

как выбрать первые 3 места по играм Game_ID на заданные Date и Period_ID
то есть количество баллов может быть одинаковым скажем у двух победителей Game_ID = 0 например 11 Player_ID 4607, 4611

ещё как выбрать места у Player_ID скажем 4607 по всем Game_ID из первых трёх мест, то есть допусти Game_ID = 0 первое место, Game_ID = 1 не попал в тройку лучших?
...
Рейтинг: 0 / 0
помогите написать запрос или подскажите где почитать
    #40103576
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие запросы пробовали? что не получилось?
...
Рейтинг: 0 / 0
помогите написать запрос или подскажите где почитать
    #40103582
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
Какие запросы пробовали? что не получилось?

Не видишь, чтоле?

Запрос на форум.
...
Рейтинг: 0 / 0
помогите написать запрос или подскажите где почитать
    #40103585
dsalodki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин,

select [Player_ID], [Points] from Tournament as t
where Points = (
select MAX([Points]) from Tournament
where [Game_ID] = 0 and [Date] = '2021-10-04' and [Period_ID] = 0
) and [Game_ID] = 0 and [Date] = '2021-10-04' and [Period_ID] = 0


вот так например могу получить первые места, потом если полученный Points использовать в where и < условие, то получится второе место, лучше как написать не знаю, но уже не здорово что много запросов. может функцию или процедуру использовать, но не знаю как вывести результат
...
Рейтинг: 0 / 0
помогите написать запрос или подскажите где почитать
    #40103587
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dsalodki
как выбрать первые 3 места по играм Game_ID на заданные Date и Period_ID
то есть количество баллов может быть одинаковым скажем у двух победителей
Допустим, у первых двух и у вторых двух количество баллов одинаково. Или у первых четверых одинаково. Какие 3 из 4 записей следует вернуть в этом случае? Или всё равно, сколько записей - надо выбрать всё для первых трёх результатов?
...
Рейтинг: 0 / 0
помогите написать запрос или подскажите где почитать
    #40103591
dsalodki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,


желательно вернуть номер места , то есть если
Допустим, у первых двух и у вторых двух количество баллов одинаково
то n столбец равен 1 для первых двух, для вторых двух n=2 , но row_number я использовал в оконной функции, оно считает как 1,2 для первых двух

with cte as
(
select
Player_ID, Points,
row_number() over (partition by Player_ID order by Points desc) as n
from
Tournament
where Game_ID = 0 AND [Date] = '2021-10-04' AND Period_ID = 0
)
select top (10)
n, Player_ID, Points
from
cte
where
n <= 3
order by
Points desc;

то есть это не правильно

наверное нужно писать три запроса для первых трёх мест, нашёл первое и количество Points потом второе по MAX(Points) , но Points < @Points1stPlase и так далее
...
Рейтинг: 0 / 0
помогите написать запрос или подскажите где почитать
    #40103595
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dsalodki
...

наверное нужно писать три запроса для первых трёх мест, нашёл первое и количество Points потом второе по MAX(Points) , но Points < @Points1stPlase и так далее

наверное нужно прочитать про groub by и Join, например, left
...
Рейтинг: 0 / 0
помогите написать запрос или подскажите где почитать
    #40103596
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerasimenko
dsalodki
...

наверное нужно писать три запроса для первых трёх мест, нашёл первое и количество Points потом второе по MAX(Points) , но Points < @Points1stPlase и так далее

наверное нужно прочитать про groub by и Join, например, left
кстати, здесь можно обойтись и просто Distinct и Left Join
...
Рейтинг: 0 / 0
помогите написать запрос или подскажите где почитать
    #40103613
dsalodki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gerasimenko,

USE [dogs_new]
GO
/****** Object: StoredProcedure [dbo].[GetBestResults] Script Date: 10/11/2021 3:30:05 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[GetBestResults]
-- Add the parameters for the stored procedure here
@date date,
@period_id int
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
declare @t table(place int, Game_ID int, Player_ID int, Points int)

declare @max_points int = 0

DECLARE @game_ID INT
SET @game_ID=0
WHILE ( @game_ID <= 10)
BEGIN


set @max_points = (select MAX([Points]) from Tournament
where [Game_ID] = @game_ID and [Date] = @date and [Period_ID] = @period_id)

if @max_points is not null
begin
-- 1st place
insert into @t (place, Game_ID, Player_ID, Points)
select 1, @game_ID, [Player_ID], [Points]
from Tournament
where Points = @max_points and [Game_ID] = @game_ID and [Date] = @date and [Period_ID] = @period_id

-- 2nd place

set @max_points = (select MAX([Points]) from Tournament
where [Game_ID] = @game_ID and [Date] = @date and [Period_ID] = @period_id and Points < @max_points)

if @max_points is not null
begin

insert into @t (place, Game_ID, Player_ID, Points)
select 2, @game_ID, [Player_ID], [Points]
from Tournament
where Points = @max_points and [Game_ID] = @game_ID and [Date] = @date and [Period_ID] = @period_id

-- 3d place

set @max_points = (select MAX([Points]) from Tournament
where [Game_ID] = @game_ID and [Date] = @date and [Period_ID] = @period_id and Points < @max_points)

if @max_points is not null
begin

insert into @t (place, Game_ID, Player_ID, Points)
select 2, @game_ID, [Player_ID], [Points]
from Tournament
where Points = @max_points and [Game_ID] = @game_ID and [Date] = @date and [Period_ID] = @period_id
end
end
end

SET @game_ID = @game_ID + 1
END

select * from @t



END


короче у меня такое решение, может можно сделать лучше
...
Рейтинг: 0 / 0
помогите написать запрос или подскажите где почитать
    #40103631
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dsalodki,

допилишь до нужного, ибо я не до конца вкурил, что тебе нужно и писал на коленке этот говнокод

Код: sql
1.
2.
3.
4.
5.
6.
select distinct t1.Game_ID, t1.Date, t1.Period_ID, 
        t2.Points, t2.Player_ID
 from #Tournament t1
   left join  #Tournament t2 on
      t2.Game_ID = t1.Game_ID and t2.Date = t1.Date and t2.Period_ID = t1.Period_ID
order by t1.Game_ID, t1.Date, t1.Period_ID, t2.Points DESC
...
Рейтинг: 0 / 0
помогите написать запрос или подскажите где почитать
    #40103634
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dsalodki
Gerasimenko,
короче у меня такое решение, может можно сделать лучше

можно если понят, что надо получить в итоге.
приложите данные и ожидаемый результат

как вариант
Код: sql
1.
2.
3.
4.
5.
6.
7.
select X.[Player_ID], X.[Game_ID], X.[Points], X.[Date], X.[Period_ID] 
from (
	select [Player_ID], [Game_ID], [Points], [Date], [Period_ID], position = DENSE_RANK() over (partition by t.[Date], t.[Period_ID] order by t.[Points] desc  )
	from @Tournament t
	where t.Date = @Date and t.Period_ID = @Period_ID
	) X
where x.position <= 3



и второй вопрос
авторещё как выбрать места у Player_ID скажем 4607 по всем Game_ID из первых трёх мест, то есть допусти Game_ID = 0 первое место, Game_ID = 1 не попал в тройку лучших?

Код: sql
1.
2.
3.
4.
5.
6.
select [Player_ID], [Game_ID], [Points], [Date], [Period_ID], BestOfTheBest = case when position <=3 then 1 else 0 end
from (
	select [Player_ID], [Game_ID], [Points], [Date], [Period_ID], position = DENSE_RANK() over (partition by t.[Date], t.[Period_ID] order by t.[Points] desc  )
	from @Tournament t
	) X
where x.[Player_ID] = @Player_ID
...
Рейтинг: 0 / 0
помогите написать запрос или подскажите где почитать
    #40103637
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKot, скорее так
авторselect top 3 *
from #Tournament t1
where Game_ID = @Game_ID AND Date = @Date AND Period_ID = @Period_ID
order by Game_ID, Date, Period_ID, Points DESC

но опять же, совершенно не понятно, что хочет ТС
...
Рейтинг: 0 / 0
помогите написать запрос или подскажите где почитать
    #40103638
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerasimenko
HandKot, скорее так
авторselect top 3 *
from #Tournament t1
where Game_ID = @Game_ID AND Date = @Date AND Period_ID = @Period_ID
order by Game_ID, Date, Period_ID, Points DESC


но опять же, совершенно не понятно, что хочет ТС
скорее так
Код: sql
1.
2.
3.
4.
select top 3 *
from #Tournament t1
where Game_ID = @Game_ID AND Date = @Date AND Period_ID = @Period_ID
order by Game_ID, Date, Period_ID, Points DESC


но опять же, совершенно не понятно, что хочет ТС
...
Рейтинг: 0 / 0
помогите написать запрос или подскажите где почитать
    #40103639
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerasimenko
Gerasimenko
HandKot, скорее так
пропущено...


но опять же, совершенно не понятно, что хочет ТС

скорее так
Код: sql
1.
2.
3.
4.
select top 3 *
from #Tournament t1
where Game_ID = @Game_ID AND Date = @Date AND Period_ID = @Period_ID
order by Game_ID, Date, Period_ID, Points DESC


но опять же, совершенно не понятно, что хочет ТС

order by Points DESC
...
Рейтинг: 0 / 0
помогите написать запрос или подскажите где почитать
    #40103657
dsalodki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gerasimenko,

спасибо, больше задачу не нужно решать
date и periodId это параметры
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / помогите написать запрос или подскажите где почитать
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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