【问题标题】:Query all rows in server where 2 columns match at least n number of times, with multiple conditions查询服务器中2列至少匹配n次的所有行,具有多个条件
【发布时间】:2018-10-18 08:01:25
【问题描述】:

我在 SQL Operations Studio (SQL Server) 中有一个表,其中包含 A、B、C、D 列。我想查询具有以下条件的所有行:

使用示例数据编辑

   A    B    C    D
1  a    b    c    r
2  g    b    c    r
3  n    h    f    r
4  k    u    e    z
5  h    i    e    z
  1. C 和 D 列中的值至少匹配 2 次​​li>
  2. D 列中的值必须至少出现 3 次

返回:

   A    B    C    D
1  a    b    c    r
2  g    b    c    r
3  n    h    f    r

【问题讨论】:

  • 具有预期结果的样本数据会很棒
  • 样本数据最好使用DDL + DML。请edit您的问题包括它,您当前的尝试和您想要的结果。更多详情,read this.
  • 您可以将样本数据减少到 2 和 3
  • 您预期输出中的第 3 行似乎与描述不符 - f 值仅在 c 列中存在一次

标签: sql-server group-by sql-operations-studio


【解决方案1】:

这是一种简单的方法,即使用带有几个 count...over 表达式的 cte。

首先,创建并填充示例表(请在您以后的问题中保存我们这一步)

DECLARE @T AS TABLE
(
    A char(1), 
    B char(1), 
    C char(1), 
    D char(1)
);    

INSERT INTO @T (A, B, C, D) VALUES
('a', 'b', 'c', 'r'),
('g', 'b', 'c', 'r'),
('n', 'h', 'f', 'r'),
('k', 'u', 'e', 'z'),
('h', 'i', 'e', 'z');

然后,cte:

WITH cte AS
(
    SELECT A, B, C, D,
            COUNT(*) OVER(PARTITION BY C, D) As CDCount,
            COUNT(*) OVER(PARTITION BY D) As DCount
    FROM @T
)

查询:

SELECT A, B, C, D
FROM cte
WHERE CDCount >= 2     
AND DCount >= 3
ORDER BY A

结果:

A   B   C   D
a   b   c   r
g   b   c   r

【讨论】:

  • 好的,既然你有示例数据,很明显我的第一个版本实际上是正确的,所以我回滚了我之前的编辑。
  • 分析函数对这个问题真的很有用。聚合方法需要 2 个子查询(我认为);不那么优雅。
  • @TimBiegeleisen 是的,我想和一个小组一起去,但是当我开始写它时,我突然意识到使用 count() over 会大大简化脚本
  • @ZoharPeled 这不适合我。我在第一个 COUNT 处收到一个没有意义的语法错误:“'(', 期望 ')' 附近的语法不正确,EXCEPT 或 UNION”
  • 也许你漏掉了一个逗号或其他东西——我不知道你的代码有什么问题——my code is working just fine.。如果您可以发布您实际使用的代码,也许我可以帮助您修复它。
猜你喜欢
  • 1970-01-01
  • 2017-03-15
  • 2011-12-02
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
相关资源
最近更新 更多