我有一个包含40列的事件表,最多可填写20亿条记录。在该事件表中,我想查询一个组合事件,即事件A与事件B.有时我可能想要找到更多的组合,如事件A与B和C.它可能会转到5或6组合。
我不想为每个组合的事件扫描该表,即扫描事件A和扫描事件B.我需要一个通用的方法来进行更多的组合扫描。
注意:根据事件日期划分了20亿条记录,并且数据被平分。
例如:
需要查找包含事件A,B,C并且需要查找仅包含A,B的ID的ID。
这个组合数量是动态的。我不想为每个事件扫描该表,最后与结果相交。
答案 0 :(得分:0)
SELECT * from table as A
JOIN table AS B
ON A.Id = B.Id AND A.Date = B.Date
WHERE Date = '1-Jan'
AND A.Event = 'A'
AND B.Event = 'B'
这将为您提供行,其中Date为'1-Jan',并且两个事件的Id相同。 如果您想要按更多事件过滤,可以反复加入表格。
答案 1 :(得分:0)
having clause允许您使用aggregate function的结果进行过滤。我使用了常规计数,但根据您的桌面设计,您可能需要一个明确的计数。
示例:
-- Returns ids with 3 or more events.
SELECT
x.Id,
COUNT(*) AS EventCount
FROM
(
VALUES
(1, '2017-01-01', 'A'),
(1, '2017-01-01', 'B'),
(1, '2017-01-03', 'C'),
(1, '2017-01-04', 'C'),
(1, '2017-01-05', 'E'),
(2, '2017-01-01', 'A'),
(2, '2017-01-01', 'B'),
(3, '2017-01-01', 'A')
) AS x(Id, [Date], [Event])
GROUP BY
x.Id
HAVING
COUNT(*) > 2
;
返回
Id EventCount
1 5
答案 2 :(得分:0)
使用sql server等效的mysql group_concat函数可能会有一些里程。 例如
drop table t
create table t (id int, dt date, event varchar(1))
insert into t values
(1,'2017-01-01','a'),(1,'2017-01-01','b'),(1,'2017-01-01','c'),(1,'2017-01-02','c'),(1,'2017-01-03','d'),
(2,'2017-02-01','a'),(2,'2017-02-01','b')
select id,
stuff(
(
select cast(',' as varchar(max)) + t1.event
from t as t1
WHERE t1.id = t.id
order by t1.id
for xml path('')
), 1, 1, '') AS groupconcat
from t
group by t.id
Results in
id groupconcat
----------- -----------
1 a,b,c,c,d
2 a,b
如果您再添加patindex
select * from
(
select id,
stuff(
(
select cast(',' as varchar(max)) + t1.event
from t as t1
WHERE t1.id = t.id
order by t1.id
for xml path('')
), 1, 1, '') AS groupconcat
from t
group by t.id
) s
where patindex('a,b,c%',groupconcat) > 0
你得到了这个
id groupconcat
----------- ------------
1 a,b,c,c,d