筛选特定列和 return 所有列

Filter on specific columns and return all columns

我正在尝试左连接两个 table 并从 table 中检索所有列,但根据一组列删除重复项。

SELECT A.*, B.impact
FROM #Site_one AS A WITH (NOLOCK)
LEFT JOIN #Progress AS B With (NOLOCK)
   ON lower(A.site_code) = lower(B.site_code)
GROUP BY A.date, A.operationid, A.worklocation, A.siteid, A.alias

这不起作用,因为 A 中将有列需要聚合或添加到 group by 子句。问题是我不想过滤这些列,也不希望它们聚合。

有没有办法 select A 中的所有列和 B 中的影响列,并且仍然能够过滤掉 group by 子句中指定列的重复项?

任何 pointers/help 将不胜感激。

and still be able to filter out duplicates on the columns specified in the group by clause

但是,数据库如何真正知道要丢弃哪些行?假设你有:

Person
John, 42, Stockbroker
John, 36, Train driver
John, 58, Retired
John, 58, Metalworker

并且您认为“我想根据名称删除重复数据”:

SELECT * FROM person GROUP BY name

那么 DB 应该丢弃哪三个 John

它不能为你决定这个;您必须编写查询以明确要保留或抛出的内容

你可以 MAX 一切:

SELECT name, MAX(age), MAX(job) FROM person GROUP BY name

那行得通.. 但它给你一个原始数据中不存在的约翰:

John, 58, Train driver

你可以说“我只会保留最大年龄的人”:

SELECT p.* 
FROM
  person p 
  INNER JOIN (SELECT name, max(age) as maxage FROM person GROUP BY name) maxp
  ON p.name = maxp.name AND p.age = maxp.maxage

..但是有两个人的最大年龄相同

您的数据库可能有行号分析,这很好:

SELECT *, row_number() over(PARTITION BY name ORDER BY age DESC) rn
FROM person

您 58 岁的 Johns 中的一个将获得第 1 行 - 无法确定是哪一个,但是您可以随后丢弃所有 rn > 1 的行:

WITH x as (    
  SELECT *, row_number() over(PARTITION BY name ORDER BY age DESC) rn
  FROM person
)
SELECT name, age, job 
INTO newtable
FROM x
WHER rn = 1

..但是如果你丢弃了错误的 John 怎么办...


你将不得不再考虑一下,并明确指定要丢弃的东西...