Mysql 另一个组中的SQL变量组

Mysql 另一个组中的SQL变量组,mysql,sql,dataset,sas,Mysql,Sql,Dataset,Sas,我正在寻找一种方法,从一个更大的其他结果列表中匹配一组结果,并计算匹配的数量。例如: 我有一套结果 Result 1 sub1 sub2 sub3 Result 2 sub1 sub2 sub3 我需要找出上面的结果集在下面一个更大的结果数据集中出现的次数 Result 1 sub1 sub2 sub3 Result 2 sub1 sub3 sub4 Result 2 sub1 sub2 sub3 Result 2 sub1 sub2 sub3 sub4 在上面的示例中,第一个集合中

我正在寻找一种方法,从一个更大的其他结果列表中匹配一组结果,并计算匹配的数量。例如:

我有一套结果

Result 1
sub1
sub2
sub3

Result 2
sub1
sub2
sub3
我需要找出上面的结果集在下面一个更大的结果数据集中出现的次数

Result 1
sub1
sub2
sub3

Result 2
sub1
sub3
sub4

Result 2
sub1
sub2
sub3

Result 2
sub1
sub2
sub3
sub4
在上面的示例中,第一个集合中的结果1将与第二个集合中的第一个结果匹配,结果2将与第二个集合中的最后两个结果匹配,因为它们包含第一个集合中的所有子结果。因此,结果1将显示频率计数为1,而结果2将显示频率计数为2

我对SQL比较陌生,但希望找到上述问题的解决方案

昨天的样本数据:

Group    Ad   Date
A        1    7/14
A        2    7/14
A        3    7/14
B        1    7/14
B        2    7/14
B        3    7/14
B        4    7/14
C        1    7/14
D        1    7/14
D        3    7/14
D        4    7/14
我需要知道A组在过去的一周里播放了多少次广告1-3,但周一A组只播放了广告1和广告3。我不希望返回此结果。周二A组播放了广告1、2、3、4。我想知道这个结果,星期三A组有广告1,2,3次,这一次我想知道

Group    Ad   Date
A        1    7/09
A        3    7/09
A        1    7/10
A        2    7/10
A        3    7/10
A        4    7/10
A        1    7/14
A        2    7/14
A        3    7/14
因此,举个例子,我希望看到:

Group    Ad   Date
A        1    7/10
A        2    7/10
A        3    7/10
A        1    7/14
A        2    7/14
A        3    7/14

这有点混乱,但以下是我能想到的:

SELECT a.*, b.*
FROM 
(
    SELECT 'A' AS grp, 1 AS ad UNION ALL
    SELECT 'A', 2 UNION ALL
    SELECT 'A', 3
) a 
CROSS JOIN
(
    SELECT DISTINCT date
    FROM tbl
    WHERE date >= CURDATE() - INTERVAL 1 WEEK
) b
LEFT JOIN tbl c ON a.grp = c.grp
               AND a.ad = c.ad
               AND b.date = c.date
INNER JOIN
(
    SELECT a.date
    FROM 
    (
        SELECT 'A' AS grp, 1 AS ad UNION ALL
        SELECT 'A', 2 UNION ALL
        SELECT 'A', 3
    ) a 
    CROSS JOIN
    (
        SELECT DISTINCT date
        FROM tbl
        WHERE date >= CURDATE() - INTERVAL 1 WEEK
    ) b
    LEFT JOIN tbl c ON a.grp = c.grp
                   AND a.ad = c.ad
                   AND b.date = c.date
    GROUP BY a.date
    HAVING COUNT(1) = COUNT(c.grp)
) d ON b.date = d.date
我有点累了,写不出解释,但也许明天醒来时,我会继续我的答案

现在,您可以查看。请注意,我插入的值比示例数据中的值多了四个,以展示当集合每天出现多次时查询的工作方式

^您可以在第二个执行的查询中看到,您还可以通过SAS SQL中的
将计数(1)>=2

来过滤集合每天出现的频率:

    proc sql;
    CREATE TABLE tbl (
      grp CHAR(1),
      ad INT,
      date DATE
    );

    INSERT INTO tbl 
    values('A', 1, '09jul2012'd) 
    values('A', 3, '09jul2012'd) 
    values('A', 1, '10jul2012'd) 
    values('A', 2, '10jul2012'd)
    values('A', 3, '10jul2012'd) 
    values('A', 4, '10jul2012'd) 
    values('A', 1, '14jul2012'd) 
    values('A', 2, '14jul2012'd) 
    values('A', 3, '14jul2012'd) 
    values('A', 1, '14jul2012'd) 
    values('A', 2, '14jul2012'd) 
    values('A', 3, '14jul2012'd) 
    ;
    quit;

    proc sql noprint; /* the set and upper date I'm interested in */
    CREATE TABLE my_set (
      grp CHAR(1),
      ad INT,
      date DATE
    );

    INSERT INTO my_set (grp, ad)
    VALUES ('A', 1)
    VALUES ('A', 2)
    VALUES ('A', 3)
    ;
    update my_set set date=today()-1;
    select count(*) into :my_set_size from my_set
    ;
    quit;

    proc sql;
    create table potential_dates as
     select t.date, s.grp, s.ad, count(*) as ad_occurrence
    from my_set s
     inner join tbl t 
        on s.grp = t.grp and s.ad = t.ad and s.date >= t.date
     group by t.date, s.grp, s.ad
    ;
    quit;

    proc sql;
        create table result as
            select a.* from potential_dates a
             inner join (select date from potential_dates
                        group by date
                        having count(*) = &my_set_size ) d
            on a.date = d.date
    ;
    quit;


 date     grp        ad  ad_occurrence
 10JUL12  A           1              1
 10JUL12  A           2              1
 10JUL12  A           3              1
 14JUL12  A           1              2
 14JUL12  A           2              2
 14JUL12  A           3              2

也许你可以排序和转置:

proc sort data=mydata1;
  by group date;
run;

proc transpose data=mydata1 out=mydata2;
  by group date;
  var ad;
run;

data mydata3;
  set mydata2;
  if not missing(col1,col2,col3);
run;
每个日期将有一行。如果需要,您可以将其合并回原始数据:

data mydata4;
  merge mydata1 mydata3;
  by group date;
run;

“潜艇”是什么?你能发布一些示例数据和可能想要的结果吗?你能至少发布一个模式供我们使用吗?我们需要知道数据是如何表示的。每个组都有自己的唯一id吗?集合是在它们自己的表中还是由id表示?@ZaneBien示例数据是专有的,所以我不能发布它。我们每天都有一系列的广告。这些广告在团体中播放。示例中的“结果”是组,“sub”是组内的广告。并不是一组中的每个广告每天都会播放。有时广告会添加到组中,有时广告会从组中删除。我需要知道在一个特定的日期范围内,一组给定的广告在一个特定的组中运行了多少次。我们不需要您的实际数据,但我们只需要知道您的表结构是如何布置的,这样我们就可以更好地了解您的情况。简单编造的数据非常好。好的,太好了!我们快到了。。。还有一件事:你怎么知道什么时候,什么广告在什么日期播出?它是存储在另一个表中还是所有内容都在一个表中?
COUNT(如果c.grp为NULL,则为1 END)=0
可以简化为:
COUNT(*)=COUNT(c.grp)
或者完全删除它,例如
LEFT
加入
内部
一个。@ypercube,很好,谢谢。它需要所有的简化,因为它可以使用。这是伟大的!有没有办法增加一点自动化?我在想类似于从表中选择*,其中日期=昨天,按日期分组,分组,和。。。然后将该查询的结果提供给本周剩余时间的查找。我正在查看的数据集每天都会有数万条广告。而且,在一组广告中并不总是有3个广告,有时会有一个,有时会有2个、3个、4个、5个或更多。再次感谢你@汤姆,如果所有的东西都在同一张表中,我仍然不明白你是如何定义“组”的。A(1,2,3)是一个群吗?A(2,3,4,5,6)是另一个群吗?任何组合都是它自己的组吗?这取决于日期吗?如果有两列(组、ad)可以具有重复值,您如何进行区分?