我有一个300,000行的数据集,查看美国收获的面积。有些(但并非我所有的数据都二重计数),我正在尝试删除双重计数。数据看起来像这样:
Year | State | Crop | Practice | Acres Harvested | Acres
-------------------------------------------------------------
2008 1 1 1 1000 or more 40
2008 1 1 1 1000 to 1999 10
2008 1 1 1 2000 to 2999 30
2008 2 1 1 1000 or more 87
2008 3 2 2 1.0 to 14.9 15
2008 3 2 2 1.0 to 4.9 5
2008 3 2 2 5.0 to 14.9 10
某些行是[ACRESed]列中其他行的子集(第2和3行是第1行的子集,第6和7行是第5行5的子集)。在我有更多详细信息的[ACRESed]收获(第2行)提供的信息(第2行提供的详细信息)中,我想保留详细信息(第2和第3行)并省略一般信息(第1行)。在其他情况下,我只有一般信息(第4行),所以这就是我要保留的。
我很难编写代码以省略详细信息时省略一般信息,但是在不存在详细信息时,请保留一般信息。
我一直在尝试编写一个"内在联接",以与自己一起加入我的桌子,但是不确定在满足某些条件时如何省略行。我拥有的:
SELECT *
FROM A
INNER JOIN (SELECT *
FROM A
GROUP BY [YEAR], [STATE], [CROP], [PRACTICE]
HAVING COUNT (*) > 1) AS B
ON A.Year = B.Year
AND A.State = B.State
AND A.Crop = B.Crop
AND A.Practice = B.Practice
现在我卡住了...
结果应该看起来像:
Year | State | Crop | Practice | Acres Harvested | Acres
-------------------------------------------------------------
2008 1 1 1 1000 to 1999 10
2008 1 1 1 2000 to 2999 30
2008 2 1 1 1000 or more 87
2008 3 2 2 1.0 to 4.9 5
2008 3 2 2 5.0 to 14.9 10
感谢任何帮助!
您的问题有点模糊。这将返回您为已指定的输入数据指定的结果集:
select a.*
from a
where a.acres_harvested not like '% or more' or
not exists (select 1
from a a2
where a2.year = a.year and a2.state = a.state and a2.crop = a.crop and
a2.acres_harvested like '[0-9]%to%[0-9]'
);
假设您的"更详细信息"的标准是我在评论中猜测的匹配集的记录方式。您只使用一个记录进行记录集,并分别具有多个记录的记录,而UNION
则进行了记录,而不是尝试使用一个SELECT
进行。
SELECT A.*
FROM A
GROUP BY [YEAR], [STATE], [CROP], [PRACTICE]
HAVING
COUNT (*) = 1
UNION
SELECT A.*
FROM A
INNER JOIN
(SELECT [YEAR], [STATE], [CROP], [PRACTICE]
FROM A
GROUP BY [YEAR], [STATE], [CROP], [PRACTICE]
HAVING
COUNT (*) > 1
) AS B
ON A.[Year] = B.[Year]
AND A.[State] = B.[State]
AND A.[Crop] = B.[Crop]
AND A.[Practice] = B.[Practice]
WHERE [ACRES HARVESTED] not like '%%or more'
如果您的标准不是我想更改WHERE
子句。
鉴于您更新的示例数据,您还必须检查重叠的数字范围。这个问题有一些有关如何执行此操作的选项:丢弃结果SQL Server中包含的现有日期。您还需要将" X到Y"值也分为两个数字字段。