需要解决方案以避免在巨大的桌子上重复扫描

时间:2017-06-07 07:39:12

标签: sql sql-server events combinations tagging

我有一个包含40列的事件表,最多可填写20亿条记录。在该事件表中,我想查询一个组合事件,即事件A与事件B.有时我可能想要找到更多的组合,如事件A与B和C.它可能会转到5或6组合。

我不想为每个组合的事件扫描该表,即扫描事件A和扫描事件B.我需要一个通用的方法来进行更多的组合扫描。

注意:根据事件日期划分了20亿条记录,并且数据被平分。

例如:

Sample Data

需要查找包含事件A,B,C并且需要查找仅包含A,B的ID的ID。

这个组合数量是动态的。我不想为每个事件扫描该表,最后与结果相交。

3 个答案:

答案 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