筛选特定列和 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 怎么办...
你将不得不再考虑一下,并明确指定要丢弃的东西...
我正在尝试左连接两个 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 怎么办...
你将不得不再考虑一下,并明确指定要丢弃的东西...