【问题标题】:Is it possible to count() a subset of a distinct query?是否可以 count() 一个不同查询的子集?
【发布时间】:2014-01-18 00:26:57
【问题描述】:

我有一个小的 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 和 12-31-13 之间获得奖励但之前未获得奖励的 family_id 的不同(计数行)数。

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

例如:

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 月至 3 月)将有 1 个新的、不同的 family_id,这表明这一年是如何开始的。 ... 季度 2 ... 季度 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' )

【问题讨论】:

  • 这是我正在测试的查询: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-10-01' AND date_received
  • 。 .这应该被编辑到问题中,而不是在评论中。 (我已经这样做了。)

标签: mysql


【解决方案1】:

获得“第一”的最简单方法是在日期上使用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);

编辑:

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

【讨论】:

  • 恐怕我不完全理解戈登回答中的逻辑。你介意一个简短的解释吗?此外,如果是会计年度而不是日历年,此查询是否成立? (我知道这不是原始问题的一部分,只是好奇)
  • 戈登。我有这个理论,你是某种机器人。你的回答太快太透彻了!请放慢脚步,恢复一些可信度! ;-)
【解决方案2】:

您使用的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' )` 

【讨论】:

  • 如果一个家庭在第 1,2 或第 3 季度获得福利 - 那么我不希望他们在第 4 季度的计数中。虽然在您的示例中,太阳查询正在获取家庭列表来自相关年份之前的任何内容的 ID。我没有看到我想要达到的数字。我是不是误会了什么?
  • @user2977468 我的错字。以上将选择在2013-09-30之前没有获奖但在2013-09-302013-12-31之间获奖的家庭。
  • @user2977468 我很抱歉。误解了你需要什么。确认:您想要的输出是每季度新获奖家庭的数量?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 2011-05-28
  • 2021-11-14
相关资源
最近更新 更多