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 天找到并重新计算。

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

4

2 回答 2

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
于 2012-04-06T16:32:59.607 回答
0

我不太关注您的查询,但根据问题的描述,我会说创建一个子查询,为每个项目提供最小扫描日期,按项目分组,然后执行您的外部选择。

于 2012-04-06T16:28:56.097 回答