计算SQL中的重复次数

时间:2016-01-28 21:27:12

标签: sql sql-server tsql

我试图解决一个问题,但没有成功。

我有两个号码列表

{1,2,3,4}
{5,6,7,8,9}

我有桌子

ID     Number
1        1
1        2
1        7
1        2
1        6
2        8 
2        7
2        3
2        9

现在我需要计算第二个列表中的数字来自第一个列表中的数字的次数,但我应该只计算一个id

上面示例表中的

结果应为2

三个匹配的句子,但因为我们只有两个不同的ID结果是2而不是3

帕尔斯:

1     2
1     7
1     2
1     6
2     3
2     9

请注意。我使用MSSQL

编辑。还有一个列确定了订单日期

Edit2 - 解决方案

我写这个查询

SELECT * FROM table t
left JOIN table tt ON tt.ID = t.ID 
    AND tt.Date > t.Date 
    AND t.Number IN (1,2,3,4) 
    AND tt.Number IN (6,7,8,9) 

在此之后,我有一个按ID分组的计划,每个id只使用一个匹配,但执行需要很长时间

1 个答案:

答案 0 :(得分:3)

这是一个可以执行此操作的查询:

select     a.id, min(a.number) as a, min(b.number) as b
from       mytable a
inner join mytable b
        on a.id = b.id
       and a.date < b.date
       and b.number in (5,6,7,8,9)
where      a.number in (1,2,3,4)
group by   a.id

输出是:

id  a   b
1   1   6
2   3   9

因此,两对在一行中输出,值 a 属于第一组数字,列 b 的值为第二组

这是fiddle

关于尝试的评论(编辑2以提问)

稍后您添加了对您的问题的查询尝试。关于该尝试的一些评论:

  • 您不需要left join,因为您确实希望两个值都匹配。 inner join通常具有更好的性能,因此请使用它。
  • 条件t.Number IN (1,2,3,4)不属于on子句。结合left join,结果将包含违反此条件的t条记录。它应该放在where条款中。
  • 您对性能的担忧可能是合理的,但可以通过在您的表格上添加有用的索引来解决,例如在(id, number, date)(id, date, number)