Группировать по с агрегатом для получения записи в SQL Server? - PullRequest
0 голосов
/ 21 февраля 2019

Мне нужно сгруппировать столбец SP и отфильтровать значение Min И Max на основе T и получить результат в выбранном запросе.

ТАБЛИЦА

RawS    RawI  SS    SP  T
14299    52  14299  105 1
14299    53  14299  105 2
14299    54  14299  105 3
14299    56  14299  106 2
14299    57  14299  106 3
14299    58  14299  107 1
14299    59  14299  107 2
14299    60  14299  107 3

Я пытался с небольшим запросом Если я добавлю столбец Raws в свой запрос, то получаю ошибку SQL для использования агрегатных функций.

SELECT 
     ar1.SP,
     MIN(ar1.T) AS T1,
     MAX(ar1.T) AS T2 FROM An ar1
     Group by  ar1.SP

Требуется формат вывода.

RawS1  RaWI1 RawS2  RawI2 SP     T1  T2
14299   52   14299  54    105    1   3
14299   56   14299  57    106    2   3
14299   58   14299  60    107    1   3

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Вот вариант для вас.Подзапрос, чтобы получить минимальную и максимальную T для каждого SP.Затем 2 присоединяются, чтобы получить другие данные.

DECLARE @TestData TABLE
    (
        [RawS] INT
      , [RawI] INT
      , [SS] INT
      , [SP] INT
      , [T] INT
    );

INSERT INTO @TestData (
                          [RawS]
                        , [RawI]
                        , [SS]
                        , [SP]
                        , [T]
                      )
VALUES ( 14299, 52, 14299, 105, 1 )
     , ( 14299, 53, 14299, 105, 2 )
     , ( 14299, 54, 14299, 105, 3 )
     , ( 14299, 56, 14299, 106, 2 )
     , ( 14299, 57, 14299, 106, 3 )
     , ( 14299, 58, 14299, 107, 1 )
     , ( 14299, 59, 14299, 107, 2 )
     , ( 14299, 60, 14299, 107, 3 );


SELECT     [a1].[RawS] AS [RawS1]
         , [a1].[RawI] AS [RawI1]
         , [a2].[RawS] AS [RawS1]
         , [a2].[RawI] AS [RawI2]
         , [a].*
FROM       (
               SELECT   [SP]
                      , MIN([T]) AS [T1]
                      , MAX([T]) AS [T2]
               FROM     @TestData
               GROUP BY [SP]
           ) AS [a]
INNER JOIN @TestData [a1]
    ON [a1].[SP] = [a].[SP]
       AND [a1].[T] = [a].[T1]
INNER JOIN @TestData [a2]
    ON [a2].[SP] = [a].[SP]
       AND [a2].[T] = [a].[T2];
0 голосов
/ 21 февраля 2019

Разве это не просто функции MIN и MAX, сгруппированные по SP и SS (чего нет в требуемом выводе)?

with An as (
      select 14299 as RawS ,52 as RawI ,14299 as SS ,105 as SP ,1 as T
union select 14299 as RawS ,53 as RawI ,14299 as SS ,105 as SP ,2 as T
union select 14299 as RawS ,54 as RawI ,14299 as SS ,105 as SP ,3 as T
union select 14299 as RawS ,56 as RawI ,14299 as SS ,106 as SP ,2 as T
union select 14299 as RawS ,57 as RawI ,14299 as SS ,106 as SP ,3 as T
union select 14299 as RawS ,58 as RawI ,14299 as SS ,107 as SP ,1 as T
union select 14299 as RawS ,59 as RawI ,14299 as SS ,107 as SP ,2 as T
union select 14299 as RawS ,60 as RawI ,14299 as SS ,107 as SP ,3 as T
)
select min(RawS) as RawS1
     , min(RawI) as RawI1
     , max(RawS) as RawS2
     , max(RawI) as RawI2
     , SP
     , min(T) as T1
     , max(T) as T2
  from An
group by SP, SS
0 голосов
/ 21 февраля 2019

Это появляется , чтобы получить результат, который вы ищете:

WITH VTE AS(
    SELECT *
    FROM (VALUES (14299,52,14299,105,1),
                 (14299,53,14299,105,2),
                 (14299,54,14299,105,3),
                 (14299,56,14299,106,2),
                 (14299,57,14299,106,3),
                 (14299,58,14299,107,1),
                 (14299,59,14299,107,2),
                 (14299,60,14299,107,3))V(RawS,RawI,SS,SP,T))
SELECT RawS,
       Min(RawI) AS RawI1,
       SS AS RawS2,
       MAX(RawI) AS RawI2,
       SP,
       MIN(T) AS T1,
       MAX(T) AS T2
FROM VTE
GROUP BY RawS,
         SS,
         SP;

Не знаю, почему вы получили ошибку, так как этот запрос выполнялся нормально дБ <>fiddle , что означает, что это был не тот запрос, который вы выполняли.

...