Запрос Sql для определения порогового значения

У меня есть интересная проблема SQL, я бы оценил некоторые предложения.

У меня есть стол со столбцами:

DateAdded
Score
Team

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

Каждый член оценки команды добавляется вместе, команда, которая достигает пороговой оценки, сначала выигрывает.

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

1
Что вы уже пробовали? И что вы подразумеваете под «датировкой»? Если баллы могут быть добавлены позже в любое время, то как вы знаете наверняка, когда достигнут порог? Например, команда A может пройти порог в среду, а затем в четверг команда B вводит данные, которые показывают, что они передали ее за день до этого во вторник. Возможно, это не то, что вы имели в виду, но ваше описание не очень ясное.
добавлено автор Pondlife, источник

5 ответы

То, что вам нужно, это совокупная сумма. И SQL Server 2008 не поддерживает его. Хорошие новости, SQL Server 2012.

Таким образом, вы можете сделать это с помощью коррелированного подзапроса:

select team, min(dateadded) as FirstPastThreshold
from (select dateadded, score, team,
             (select sum(score) from t t2 where t2.team = t.team and t2.dateadded <= t.dateadded) as cumulativescore
      from t
     ) t
where cumulativescore>= @threshhold
group by team
2
добавлено
cumscore - очень плохой выбор именования ... просто говоря
добавлено автор beder, источник

Я думаю, это то, чего вы хотите достичь.

SELECT TOP 1 T1.Dateadded, T1.Team FROM Table1 T1
 JOIN Table1 T2
  ON T1.Team = T2.Team
    and T1.Dateadded >= T2.Dateadded
GROUP BY T1.Dateadded, T1.Team
HAVING SUM(T2.Score) >= @Threshold
ORDER BY T1.Dateadded 

SQL Fiddle

2
добавлено
Это действительно то, что мне нужно - большое спасибо
добавлено автор Liath, источник

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

WITH CTE AS
(
  SELECT 
    DateAdded, Score, Team,
    DENSE_RANK() OVER (Order By DateAdded ASC, Score DESC) AS Rank
  FROM dbo.TableName
  WHERE
    Score >= Threshold
)
SELECT 
  DateAdded, Score, Team
FROM CTE
WHERE
  Rank = 1

Обратите внимание, что это может возвращать несколько команд.

1
добавлено
Это отличный ответ, но не то, что я ожидал, потому что я не смог правильно описать вопрос. Я был после того, когда комбинированный счет команды достиг порога не тогда, когда кому-то из команды удается забить за порог
добавлено автор Liath, источник
@beder: Но я сортирую по DateAdded сначала, а затем по счету (возможно, вы имеете в виду мою первую версию, которую я редактировал в льготный период).
добавлено автор Tim Schmelter, источник
Учитывая, что он хочет знать, кто достиг порога FIRST, вы, вероятно, должны сначала заказать по датеAdded, а затем по счету, чтобы получить Rank. Также неясно, есть ли у него запись для каждого нового балла или если они суммируют новый балл в существующей строке; что немного изменит ваш запрос WITH
добавлено автор beder, источник
Ах, извините, я думаю, что он не освежился, когда я прокомментировал
добавлено автор beder, источник

Вы можете добавить четвертый столбец с именем currentThresholdScore. Когда когда-либо вставлена ​​новая запись, текущий столбец CurrentThresholdScore будет значением того, что записывает Score плюс любые предыдущие записи, которые были вставлены. Затем проверьте, превышает ли currentThresholdScore пороговое значение для отправки почты и т. Д.

0
добавлено
В то время как это будет работать, вам нужно будет пересчитать столбцы, которые могут потребоваться для ресурса. Я после запуска после решения.
добавлено автор Liath, источник

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

Sql Fiddle

Use tempdb
Create Table Scoring (DateAdded DateTime, Score INT, Team INT)
INSERT Scoring SELECT GetDate(), 100, 1
INSERT Scoring SELECT GetDate()+1, 150, 1
INSERT Scoring SELECT GetDate()+1, 50, 2
INSERT Scoring SELECT GetDate()+2, 75, 2
INSERT Scoring SELECT GetDate()-10, 75, 2


DECLARE @Threshhold INT
SET @Threshhold = 125

-- Table which includes a cumulative score
;WITH tbl AS 
(
SELECT 
    Team, 
    DateAdded, 
    Score, 
    -- This column calculates the current score + the sum of past scores
    IsNull((SELECT Sum(t2.Score) CumScore FROM Scoring t2 WHERE t2.Team = t.Team AND t2.DateAdded < t.DateAdded),0) 
    + Score AS  CumScore
FROM Scoring t
)

-- Find first record > threshold
SELECT TOP 1 * FROM tbl
WHERE CumScore >= @Threshhold
ORDER BY DateAdded ASC
0
добавлено
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)