如果其他三个字段中的两个相同,如何从id列中选择max

时间:2013-11-23 18:50:45

标签: sql ms-access-2007

我有一张存储耗材成本的表格。

consumable_cost_id  consumable_type_id  from_date   cost
1                   1                   01/01/2000  £10.95
2                   2                   01/01/2000  £5.95
3                   3                   01/01/2000  £1.98
24                  3                   01/11/2013  £2.98
27                  3                   22/11/2013  £3.98
33                  3                   22/11/2013  £4.98
34                  3                   22/11/2013  £5.98
35                  3                   22/11/2013  £6.98

如果在同一天更新同一消耗品不止一次,我想只选择当天最大的consumable_cost_id行。期望的输出将是:

consumable_cost_id  consumable_type_id  from_date   cost
1                   1                   01/01/2000  £10.95
2                   2                   01/01/2000  £5.95
3                   3                   01/01/2000  £1.98
24                  3                   01/11/2013  £2.98
35                  3                   22/11/2013  £6.98

编辑:

这是我的尝试(改编自我在这里发现的另一篇文章):

SELECT cc.* 
FROM 
    consumable_costs cc 
    INNER JOIN 
    ( 
        SELECT 
            from_date, 
            MAX(consumable_cost_id) AS MaxCcId 
        FROM consumable_costs 
        GROUP BY from_date 
    ) groupedcc 
        ON cc.from_date = groupedcc.from_date 
            AND cc.consumable_cost_id = groupedcc.MaxCcId

3 个答案:

答案 0 :(得分:2)

你非常接近。这似乎对我有用:

SELECT cc.*
FROM 
    consumable_cost AS cc
    INNER JOIN
    (
        SELECT 
            Max(consumable_cost_id) AS max_id, 
            consumable_type_id,
            from_date
        FROM consumable_cost
        GROUP BY consumable_type_id, from_date
    ) AS m
        ON cc.consumable_cost_id = m.max_id

答案 1 :(得分:0)

SELECT * FROM consumable_cost 
GROUP by consumable_type_id, from_date
ORDER BY cost DESC;

答案 2 :(得分:0)

假设consumable_cost_id是唯一的。

SELECT * FROM T t1
WHERE EXISTS(
    SELECT t2.consumable_type_id, t2.from_date FROM T t2
    GROUP by t2.consumable_type_id, t2.from_date
    HAVING MAX(t2.consumable_cost_id) = t1.consumable_cost_id);

由于注释这返回了错误的结果,我创建了一个Oracle测试查询,证明此查询有效。正如我所说的,它适用于Oracle,但实际上没有理由在MS Access中不起作用。我在这里使用的唯一Oracle特定是生成虚拟数据的FROM DUAL

WITH T AS
(
SELECT 1 AS consumable_cost_id,1 AS consumable_type_id, TO_DATE('01/01/2000','DD/MM/YYYY') AS FROM_DATE, '£10.95' AS COST FROM DUAL
UNION ALL
SELECT 2,2,TO_DATE('01/01/2000','DD/MM/YYYY'),'£5.95' FROM DUAL
UNION ALL
SELECT 3,3,TO_DATE('01/01/2000','DD/MM/YYYY'),'£1.98' FROM DUAL
UNION ALL
SELECT 24,3,TO_DATE('01/11/2013','DD/MM/YYYY'),'£1.98' FROM DUAL
UNION ALL
SELECT 27,3,TO_DATE('22/11/2013','DD/MM/YYYY'),'£1.98' FROM DUAL
UNION ALL
SELECT 33,3,TO_DATE('22/11/2013','DD/MM/YYYY'),'£1.98' FROM DUAL
UNION ALL
SELECT 34,3,TO_DATE('22/11/2013','DD/MM/YYYY'),'£1.98' FROM DUAL
UNION ALL
SELECT 35,3,TO_DATE('22/11/2013','DD/MM/YYYY'),'£1.98' FROM DUAL
)
SELECT * FROM T t1
WHERE EXISTS(
    SELECT t2.consumable_type_id, t2.from_date FROM T t2
    GROUP by t2.consumable_type_id, t2.from_date
    HAVING MAX(t2.consumable_cost_id) = t1.consumable_cost_id);

结果:

1    1   01-JAN-00   £10.95
2    2   01-JAN-00   £5.95
3    3   01-JAN-00   £1.98
24   3   01-NOV-13   £1.98
35   3   22-NOV-13   £1.98