【问题标题】:Need a SQL statement to filter rows需要一条 SQL 语句来过滤行
【发布时间】:2018-03-16 21:29:45
【问题描述】:

有一个表格如下所示:

我只需要检索突出显示的记录。而且我需要一个查询,它应该适用于存在数百万条记录的更大表。

标准:
有4组,第1组和第3组的值相似,但第2组和第4组的值不同

编辑:
我在表格中做了一些修改(添加了 ID 列)。我们如何使用 ID 列实现相同的效果?

【问题讨论】:

  • 不错。我想要一本新的 Mac 书,但没有人愿意为我买它。
  • 不会select cola,colb from table where cola in (2,4) work
  • 行高亮的标准是什么?
  • 由于防火墙,无法查看图像。有关更多详细信息,请参阅此内容,因为它不仅适用于代码:meta.stackoverflow.com/questions/285551/…
  • 亲爱的@Deepak 您需要对 SQL 有非常基本的了解。在这里,人们提出了比入门级程序员可以解决的更大的问题。您的要求也是无法理解的,记录只会有这种模式或者可能会有所不同,所以请清楚您想要的东西并自己尝试。如果它看起来很复杂,那么把它放在这里并简要解释一下,因为这里的人是编码人员而不是 Ginnie,他们可以假设你所有的百万行。这也将使您免于灾难。谢谢

标签: sql sql-server sql-server-2008 sql-server-2005 relational-database


【解决方案1】:

只返回这种集合中存在1个或多个不同值的集合

create table #ab
(
col1a int,
colb char(2)
)

insert into #ab
values
(1,'a'),
(1,'a'),
(1,'a'),
(2,'b'),
(2,'c'),
(2,'c')

select id,col1a,colb
from #ab
where col1a in (
Select col1a from #ab group by col1a having count (distinct colb)>1)

关于数百万行的性能,我可能会检查执行计划并处理它。使用我的示例数据集和我的查询,不同的排序需要近 40% 的成本..对于数百万行,它可能可以也去 tempdb..所以我建议下面的索引可以消除更多的行

create index nci on #ab(colb)
include(col1a)

【讨论】:

  • 很高兴它对您有所帮助,如果您可以发布 DDL、DML(测试数据,如我的答案中的数据)和预期结果作为文本以及解释和您尝试过的内容......您会变得更快结果
  • 不,我不想在现有表上创建索引,我只需要选择这种行
  • 当表中也存在id列时我们可以这样做吗?请检查上面的编辑。
【解决方案2】:

您也可以使用INNER JOIN 而不是IN 来实现它,因为它是百万行查询。

SELECT f.colA,f.colB
FROM
filtertable f
INNER JOIN
(
SELECT colA
FROM filtertable
GROUP BY colA
HAVING COUNT(DISTINCT colB)>1
) f1
ON f.colA = f1.colA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    相关资源
    最近更新 更多