是否可以count()一个不同的查询的子集?

时间:2014-01-17 15:36:16

标签: mysql

我有一个小的mysql表我正在尝试计算属于某个日期范围的不同行。在我走得太远之前,让我澄清一下我的问题,因为这听起来很简单。

这是表格

CREATE TABLE IF NOT EXISTS `family_awards` (
`award_id` bigint(50) NOT NULL AUTO_INCREMENT,
`family_id` bigint(50) NOT NULL,
`serviceCode` int(3) NOT NULL,`date_received` date NOT NULL,
`created_in` varchar(40) NOT NULL,`created_on` datetime NOT NULL,
`created_by` varchar(30) NOT NULL,
PRIMARY KEY (`award_id`)
)

family_id每年最多可获得4个奖励(award_id),每季度最多1个。

现在,这是我需要提供给老板的号码。 已经获得10-1-13之间奖励的family_id的不同(计数行)数量。 12-31-13,之前没有获奖。

我需要能够显示有多少家庭成员今年第一次在查询的季度内获得了福利。

例如:

AWARD_ID.   FAMILY_ID.   DATE_REC.
1           5            1/15/13
2           7            4/27/13
3           2            6/22/13
4           6            7/28/13
5           5            10/27/13
6           9            11/14/13

第1季(1月 - 月)将有1个新的,不同的family_id看到刚开始的年份。 ...... Qtr 2 ...... Qtr 3 第4季度(10月 - 12月)应该只计1,因为family_id 5已经在1月份获得了奖励。

如何在查询中执行此操作? tyvm

编辑(来自评论):

这是我正在测试的查询:

SELECT distinct(family_id)
FROM family_awards`
WHERE family_id NOT IN (SELECT distinct(family_id)
                        FROM family_awards
                        WHERE date_received > '2013-01-01' AND date_received <= '2013-09-30'
                       ) AND
     ( date_received >= '2013-10-01' AND date_received <= '2013-12-31' )

2 个答案:

答案 0 :(得分:2)

获得“第一”的最简单方法是在日期

上使用min
SELECT family_id, min(date_rec) as firstdate
FROM family_awards`
group by family_id;

现在,如果您想要四分之一的第一个,请将其用作子查询:

select year(firstdate) as y, quarter(firstdate) as q, count(*) as NumFirsts
from (SELECT family_id, min(date_rec) as firstdate
      FROM family_awards`
      group by family_id
     ) fa
group by year(firstdate), quarter(firstdate);

编辑:

你想要计算“以前没有获奖的家庭”。另一种说法是,第一个奖励是在本季度。因此,这种方法可以找到每个家庭的第一个奖项的日期,然后将其用于计算。

答案 1 :(得分:0)

您使用的NOT IN条款不包括在您想要的时间范围内获得奖励的家庭。尝试更改NOT IN子句以排除句点之外的那些:

SELECT distinct(family_id) 
FROM family_awards` 
WHERE family_id NOT IN ( 
        SELECT family_id
        FROM family_awards 
        WHERE date_received < '2013-09-30') 
    AND ( date_received >= '2013-09-30' AND date_received <= '2013-12-31' )`