2012-04-06 89 views
0

我正在构建一个数据库的报告,我需要根据公司,作业和日期确定“第一次扫描”的数量。计算组内的最小记录数

扫描表可以包含同一项目的多个扫描,但是我只想将原始扫描包括在我的COUNT中,该扫描只能被识别为与特定项目匹配的最早日期的扫描。

我在这第一次尝试:

SELECT 
    _item_detail.job_id, 
    _item_group.group_id, 
    _scan.company_id, 
    DATE(scan_date_time) as scan_date, 
    COUNT(1) 
FROM _scan 
    INNER JOIN _item_detail ON _item_detail.company_id = _scan.company_id 
    AND 
    _item_detail.serial_number = _scan.serial_number 
    INNER JOIN _item_group ON _item_group.group_id = _item_detail.group_id 
WHERE _item_detail.job_id = '0326FCM' AND _scan.company_id = '152345' AND _item_group.group_id = 13 
GROUP BY 
_item_detail.job_id, 
_item_group.group_id, 
_scan.company_id, scan_date -- first_scan_count 
HAVING min(scan_date_time); 

这是给我的不正确的结果,但(约3倍太多)。我假设这是因为MIN记录正在为每个日期重新计算,所以如果在第1天发现最小值,它也可能在第3天被发现并再次计数。

如何修改我的查询以获得所需的结果?

+0

你能交一些示例数据和所需的o/p – Teja 2012-04-06 16:30:39

回答

2

类似的东西这个应该工作...我不能完全肯定你的表是如何布局或数据如何与他们在一起,但这是总体思路:

SELECT 
    _item_detail.job_id, 
    _item_group.group_id, 
    _scan.company_id, 
    DATE(scan_date_time) as scan_date, 
    COUNT(1) 
FROM 
    _scan s1 
    INNER JOIN _item_detail 
     ON _item_detail.company_id = s1.company_id 
     AND _item_detail.serial_number = s1.serial_number 
     AND _item_detail.job_id = '0326FCM' 
    INNER JOIN _item_group 
     ON _item_group.group_id = _item_detail.group_id 
     AND _item_group.group_id = 13 
WHERE 
    s1.company_id = '152345' 
    AND s1.scan_date_time = (
     SELECT MIN(s2.scan_date_time) 
     FROM _scan s2 
     WHERE 
      s2.company_id = s1.company_id 
      AND s2.serial_number = s1.serial_number 
    ) 
GROUP BY 
    _item_detail.job_id, 
    _item_group.group_id, 
    s1.company_id 
+0

这几乎让我在需要的地方。经过一些小的修改,我很高兴去。谢谢! – 2012-04-06 18:14:42

0

我不完全按照你的查询,但根据问题的描述,我会说创建一个子查询,给每个项目的最低扫描日期,按项目分组,执行您的外部选择那。