当其他行分为子集时,SQL删除行,在没有子集时保持行



我有一个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"值也分为两个数字字段。

最新更新