sql-server - SQL : Group by one column, 计算所有行并根据 row_number 保留第二列的值

标签 sql-server t-sql sql-server-2008

我有一个查询,它根据某些规则返回 Id、Name 和 Row_Number()。

查询看起来像这样

SELECT 
    tm.id AS Id,
    pn.Name AS Name,
    ROW_NUMBER() OVER(PARTITION BY tm.id ORDER BY tm.CreatedDate ASC) AS Row
FROM 
    #tempTable AS tm
LEFT JOIN 
    names pn WITH (NOLOCK) ON tm.nameId = pn.NameId
WHERE ....

上述查询的输出如下表所示,其中包含虚拟数据

CREATE TABLE people
(
    id int,
    name varchar(55),
    row int
);

INSERT INTO people 
VALUES (1, 'John', 1), (1, 'John', 2), (2, 'Mary', 1),
       (3, 'Jeff', 1), (4, 'Bill', 1), (4, 'Bill', 2),
       (4, 'Bill', 3), (4, 'Billy', 4), (5, 'Bobby', 1),
       (5, 'Bob', 2), (5, 'Bob' , 3), (5, 'Bob' , 4);

我尝试做的是按id字段进行分组,对所有行进行计数,但对于名称,请使用row = 1

我的尝试是这样的,但是,显然,我得到了不同的行,因为我在分组依据中包含了x.name

SELECT 
    x.id,
    x.name,
    COUNT(*) AS Value
FROM
    (SELECT 
         tm.id AS Id,
         pn.Name  AS Name,
         ROW_NUMBER() OVER(PARTITION BY tm.id ORDER BY tm.CreatedDate ASC) AS Row
     FROM 
         #tempTable AS tm
     LEFT JOIN 
         names pn WITH (NOLOCK) ON tm.nameId = pn.NameId
     WHERE ....
) x
GROUP BY 
    x.id, x.name
ORDER BY 
    COUNT(*) DESC

虚拟数据所需的结果是:

id    name   count
------------------
 1    John     2
 2    Mary     1
 3    Jeff     1
 4    Bill     4
 5    Bobby    4

最佳答案

您可以使用FIRST_VALUE()窗口函数获取行号 = 1 的行的名称,并且使用关键字 DISTINCT 无需GROUP BY:

SELECT DISTINCT tm.id AS Id
     , FIRST_VALUE(pn.Name) OVER (PARTITION BY tm.id ORDER BY tm.CreatedDate ASC) AS Name
     , COUNT(*) OVER (PARTITION BY tm.id) AS counter
FROM #tempTable AS tm
LEFT JOIN names pn WITH (NOLOCK) ON tm.nameId = pn.NameId
WHERE ....

如果您无法使用FIRST_VALUE(),那么您可以使用条件聚合来实现:

SELECT id,
       MAX(CASE WHEN Row = 1 THEN Name END) AS NAME,
       COUNT(*) AS Counter
FROM (
  SELECT tm.id AS Id
       , pn.Name  AS Name
       , ROW_NUMBER() OVER(PARTITION BY tm.id ORDER BY tm.CreatedDate ASC) AS Row
  FROM #tempTable AS tm
  LEFT JOIN names pn WITH (NOLOCK) ON tm.nameId = pn.NameId
  WHERE ....
) t
GROUP BY id

关于sql-server - SQL : Group by one column, 计算所有行并根据 row_number 保留第二列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64136046/

相关文章:

c# - 方法更新C#连接错误

sql - 如何将参数列表传递给存储过程并在 SQL Server 中执行批量插入

sql-server - 根据输入参数对 SQL 结果进行排序

sql-server - 如何选择 X 随机行,同时保证 Y 某些特定行出现在结果中?

php - 如何通过 PHP 将 Unicode 数据更新到 SQL Server?

sql-server - 从 SQL Server 中的日期时间字段中获取 'date'

sql-server - 带有百分比符号 (%) 的 THROW 会产生奇怪的错误消息

sql - select语句可以更新SQL Server中的数据吗?

sql - Sum sql问题-里面的两列是相连的

SQL xml输出参数抛出错误?