【问题标题】:Group By with aggregate For Getting Record In SQL Server?用聚合分组以在 SQL Server 中获取记录?
【发布时间】:2019-02-21 19:19:44
【问题描述】:

我需要对SP 列进行分组并过滤基于MinMaxT 值并在选择查询中获取结果。

表格

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

【问题讨论】:

  • 嗯,那你一定尝试过某事
  • 请不要将文字作为图片发布。您有足够的声誉知道如何复制和粘贴代码/数据并对其进行格式化。请这样做。
  • 请不要图片,并发布您尝试过的内容?
  • 请立即检查。 @Larnu
  • 请立即检查@Brad

标签: sql sql-server group-by aggregate-functions


【解决方案1】:

这里有一个适合您的选项。子查询以获取每个 SP 的最小和最大 T。然后 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];

【讨论】:

  • 没有内部查询可以吗? @Tim Mylott
  • @PrashantGupta 我不知道。这就是我理解您的要求的方式,如果没有更大的样本数据集,很难知道在其他列上使用聚合函数是否真的能满足您的需求。
  • @PrashantGupta 我确信这是您正在使用的数据的较小样本集。 RawS 值是否始终相同?基于 SP 的 RawI 值的顺序是否总是遵循与 T 值相似的顺序?我们可能需要更广泛的背景和对您数据的理解。
【解决方案2】:

这个出现可以得到你想要的结果:

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;

不知道为什么会出现错误,因为该查询运行良好 db<>fiddle,这意味着这不是您正在运行的查询。

【讨论】:

  • 为什么需要 with 。我无法理解这个查询。你能解释一下吗? @Larnu
  • @PrashantGupta 我需要一些可以使用的样本数据!文本本身不是消耗品,所以我使用 CTE(或“VTE”(值表表达式))来实际编写可以测试的查询。
【解决方案3】:

这不只是 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

【讨论】:

    猜你喜欢
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多