【问题标题】:How to group by on selected column in sql?如何对sql中的选定列进行分组?
【发布时间】:2019-01-22 11:11:09
【问题描述】:

如何在选定列中按条件应用分组 我只想在“userdata”表的名称字段上应用分组条件。

SELECT CAST(UserId AS varchar(255)) AS UserId,
       CAST(name AS varchar(255)) AS name,
       CAST(city AS varchar(255))
FROM "userdata"
WHERE name = 'Jhohn'
GROUP BY CAST(UserId AS varchar(255)),
         CAST(name AS varchar(255)),
         CAST(city AS varchar(255));

上面的结果是

userId  name       city 
1       jhon       florida
2       sam        new york
3       sam        wales
4       thomas     new york

预期结果:

userId  name       city 
1       jhon       florida
2       sam        new york
4       thomas     new york

【问题讨论】:

  • 这应该如何工作?您期望“sam”的用户ID 值是多少?有 2 和 3。同样适用于 city 字段。
  • sql server 可能重复从组中选择第一行? – Larnu 在给定的链接中,除了要分组的字段之外的字段需要聚合。
  • 我想跳过第一个表的第三行
  • @Ocean 你可以在下面看到我的回答。这里 Min() 函数用于只保留跳过第 3 行并保留第 1 行。如果要保留第三行并删除第一行,可以使用 Max() 函数。

标签: sql-server


【解决方案1】:

你也可以使用下面的代码来做到这一点

DECLARE @Table TABLE (UserId int, [Name] varchar(255), City varchar(255));
INSERT INTO @Table (UserId,[name], city)
VALUES(1,'Jhon', 'florida') 
,(2,'sam', 'New york')
,(3,'sam','wales')
,(4,'thomas','new york');

Select t.* from @Table t
inner join (
SELECT MIN(UserId) as UserId, Name
FROM   @Table
GROUP BY
       Name
)a on t.UserId = a.UserId

你可以找到现场演示Here

【讨论】:

    【解决方案2】:

    您可以像下面这样使用ROW_NUMBER() 来实现您正在寻找的东西

    SELECT * FROM
        (
           SELECT userid, 
               NAME, 
               city, 
               Row_number() OVER(partition BY NAME ORDER BY id) RN 
        FROM   userdata 
        )T
        WHERE  T.RN= 1 
    

    我不确定你为什么将VARCHAR 数据再次转换为VARCHAR?并且您在示例查询中放置了 where 条件,该条件将过滤记录并且您不会获得所有记录。

    【讨论】:

    • where 子句将在 select 语句之前执行,并且您在 select 语句中使用别名 RN。我很困惑:)
    【解决方案3】:

    你可以像下面这样使用。

    DECLARE @Table TABLE (UserId int, [Name] varchar(255), City varchar(255));
    INSERT INTO @Table (UserId,[name], city)
    VALUES(1,'Jhon', 'florida') 
    ,(2,'sam', 'New york')
    ,(3,'sam','wales')
    ,(4,'thomas','new york');
    
    SELECT sq.userId, sq.Name, sq.City
    FROM
    (
        SELECT *, DENSE_RANK() OVER(PARTITION BY t.Name ORDER BY t.UserId) AS RNo
        FROM @Table AS t
    ) AS sq
    WHERE sq.RNo = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 2015-04-07
      • 1970-01-01
      相关资源
      最近更新 更多