按日期从具有许多重复行的数据库中提取最近的条目

时间:2015-06-22 18:33:17

标签: sql sql-server-2008

我正在尝试从数据库中提取信息,该数据库由另一个来源输入数据。事情的方式,每次这个源更新有关产品的信息,而不是做更新...它只是做一个插入。所以你在那里有很多重复的信息,所以查询如下:

SELECT
    product_data.ProductUPC,
    product_data.NAME,
    product_data.Shelf,
    product_data.Create_Time,

    --Supplier--
    Supplier     = CASE supplier_data.Supplier_Code 
                      WHEN '01' THEN 'BlueBerries'
                      WHEN '02' THEN 'Grey'
                      WHEN '03' THEN 'Coco'
                      ELSE 'OTHER' 
                   END

    --JOINS--
FROM  
    product_data
INNER JOIN
    supplier_data ON supplier_data.ProductID = product_data.ProductID
WHERE 
    product_data.ProductUPC IS NOT NULL

返回类似的内容:

ProductUPC    Product Name       Shelf      Supplier             Create_Time
12345            Cookie Cutter        NULL      NULL                 2015-01-06 16:11:00.667
12345            Cookie Cutter        NULL        BlueBerries       2015-01-22 16:11:00.667
12345            Cookie Cutter        12          BlueBerries       2015-03-06 16:11:00.667
00040            NULL                 NULL         NULL          2015-01-06 16:11:00.667
00040            Water Hose           NULL         Grey                 2015-01-22 16:11:00.667
00040            Water Hose           11           Grey             2015-03-06 16:11:00.667

我只想拉每个productUPC 的信息最多的行,这通常是具有最新“Create_Time”的行,该列位于数据库的所有表中。 所以我想要这样的回报

ProductUPC    Product Name       Shelf      Supplier             Create_Time
 12345            Cookie Cutter        12          BlueBerries       2015-03-06 16:11:00.667
 00040            Water Hose           11           Grey             2015-03-06 16:11:00.667

所以我一直在尝试MAX(Cre​​ate_Time)

SELECT
product_data.ProductUPC,
product_data.NAME,
product_data.Shelf,
product_data.Create_Time,

--Supplier--
Supplier     = CASE supplier_data.Supplier_Code WHEN
WHEN '01' THEN 'BlueBerries'
WHEN '02' THEN 'Grey'
WHEN '03' THEN 'Coco'
ELSE 'OTHER' END

--JOINS--
FROM  product_data
INNER JOIN
supplier_data ON supplier_data.ProductID = product_data.ProductID


WHERE 
product_data.ProductUPC IS NOT NULL
AND product_data.create_time = (
SELECT MAX(product_data.create_time) 
FROM product_data
)

但它只返回标题。 (没有信息)。

在选择范围内尝试MAX:

SELECT MAX(product_data.Create_Time)
product_data.ProductUPC,
product_data.NAME,
product_data.Shelf


--Supplier--
Supplier     = CASE supplier_data.Supplier_Code WHEN
WHEN '01' THEN 'BlueBerries'
WHEN '02' THEN 'Grey'
WHEN '03' THEN 'Coco'
ELSE 'OTHER' END

--JOINS--
FROM  product_data
INNER JOIN
supplier_data ON supplier_data.ProductID = product_data.ProductID
WHERE 
product_data.ProductUPC IS NOT NULL

返回错误,指出我的其他列“在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。”所以我知道我在这里走错了路。

我出错的任何提示?感谢。

1 个答案:

答案 0 :(得分:2)

您与GROUP BY走在正确的轨道上。尝试在supplier_data JOIN

下面添加类似的内容
JOIN 
   (SELECT 
        ProductUPC, MAX(Create_Time) Max_Create_Time 
    FROM product_data 
    GROUP BY ProductUPC) A ON product_data.ProductUPC = A.ProductUPC 
                           AND product_data.Create_time = A.Max_Create_Time

编辑:另外,您提到此类数据是“重复数据”。情况不一定如此。这实际上并不是追踪变化的可怕方法。使用此系统,您可以跟踪随时间推移对产品所做的每项更改。当然还有其他方法来跟踪变化,但这肯定有效。在撰写查询和开发报告时,您只需要了解它。