Как вывести только одно максимальное значение из этого запроса в SQL? - PullRequest
1 голос
/ 29 июня 2010

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

Я хочу, чтобы он выводил только одну строку, а именно максимальное значение, но он должен основываться на алгоритме в следующем запросе:

WITH Calendar AS (SELECT     CAST(@StartDate AS datetime) AS Date
                                          UNION ALL
                                          SELECT     DATEADD(d, 1, Date) AS Expr1
                                          FROM         Calendar AS Calendar_1
                                          WHERE     (DATEADD(d, 1, Date) < @EndDate))
    SELECT     C.Date, C2.Country, COALESCE (SUM(R.[Amount of people per day needed]), 0) AS [Allocated testers]
     FROM         Calendar AS C CROSS JOIN
                            Country AS C2 LEFT OUTER JOIN
                            Requests AS R ON C.Date BETWEEN R.[Start date] AND R.[End date] AND R.CountryID = C2.CountryID
     WHERE     (C2.Country = @Country)
     GROUP BY C.Date, C2.Country OPTION (MAXRECURSION 0)

Вывод сверху будет таким:

Date            Country         Allocated testers
06/01/2010      Chile             3
06/02/2010      Chile             4
06/03/2010      Chile             0
06/04/2010      Chile             0
06/05/2010      Chile            19

, но сейчас мне нужно

Allocated testers
           19

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

Ответы [ 3 ]

3 голосов
/ 29 июня 2010

используйте order и limit

ORDER BY 'people needed DESC' LIMIT 1 

EDITED

, поскольку LIMIT не существует в sql

, используйте ORDER BY и TOP

select TOP 1 .... ORDER BY 'people needed' DESC
2 голосов
/ 29 июня 2010
WITH  Calendar
        AS (
             SELECT
              CAST(@StartDate AS datetime) AS Date
             UNION ALL
             SELECT
              DATEADD(d, 1, Date) AS Expr1
             FROM
              Calendar AS Calendar_1
             WHERE
              ( DATEADD(d, 1, Date) < @EndDate )
           )
SELECT TOP 1 *
FROM 
(           
  SELECT
    C.Date
   ,C2.Country
   ,COALESCE(SUM(R.[Amount of people per day needed]), 0) AS [Allocated testers]
  FROM
    Calendar AS C
    CROSS JOIN Country AS C2
    LEFT OUTER JOIN Requests AS R
      ON C.Date BETWEEN R.[Start date] AND R.[End date]
         AND R.CountryID = C2.CountryID
  WHERE
    ( C2.Country = @Country )
  GROUP BY
    C.Date
   ,C2.Country
OPTION
    ( MAXRECURSION 0 )
    ) lst
    ORDER BY lst.[Allocated testers] DESC
1 голос
/ 29 июня 2010

Полный пример после обсуждения в @Salil answer ..

WITH Calendar AS (SELECT     CAST(@StartDate AS datetime) AS Date
                  UNION ALL
                  SELECT     DATEADD(d, 1, Date) AS Expr1
                  FROM         Calendar AS Calendar_1
                   WHERE     (DATEADD(d, 1, Date) < @EndDate))
SELECT  TOP 1   C.Date, C2.Country, COALESCE (SUM(R.[Amount of people per day needed]), 0) AS [Allocated testers]
FROM    Calendar AS C CROSS JOIN
        Country AS C2 LEFT OUTER JOIN
        Requests AS R ON C.Date BETWEEN R.[Start date] AND R.[End date] AND R.CountryID = C2.CountryID
WHERE     (C2.Country = @Country)
GROUP BY C.Date, C2.Country 
ORDER BY 3 DESC
OPTION (MAXRECURSION 0)

ORDER BY 3 означает порядок по 3-му полю в операторе SELECT, поэтому, если вы удалите первые два поля, измените его соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...