我试图解决一个问题,但没有成功。
我有两个号码列表
{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只使用一个匹配,但执行需要很长时间
答案 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
稍后您添加了对您的问题的查询尝试。关于该尝试的一些评论:
left join
,因为您确实希望两个值都匹配。 inner join
通常具有更好的性能,因此请使用它。t.Number IN (1,2,3,4)
不属于on
子句。结合left join
,结果将包含违反此条件的t
条记录。它应该放在where
条款中。(id, number, date)
或(id, date, number)