如何根据最新ID提取信息

时间:2011-08-13 12:50:45

标签: sql sql-server sql-server-2005 tsql

我有一张如下表: -

TABLEA

SERIAL  SKU GRADE   ID
HA501   R2022   2   2011063
HA501   R2022   1   2011052
HA502   R2033   2   2011051
HA502   R2033   3   2011048
HA503   R2044   1   2011034
HA503   R2044   2   2011023

我希望根据最新ID提取上述SERIAL, SKU & GRADE,如下所示:

FINAL OUTPUT            
SERIAL  SKU GRADE   ID
HA501   R2022   2   2011063
HA502   R2033   2   2011051
HA503   R2044   1   2011034

我试图使用SQL:

select 
     SERIAL, SKU, GRADE, MAX(ID) 
from tableA
group by SERIAL, SKU, GRADE

但不知何故输出似乎不对。

有人可以帮助我吗?

感谢。

4 个答案:

答案 0 :(得分:2)

试试这个:

SELECT *
  FROM tableA
WHERE id IN 
(
    SELECT MAX(id) 
            FROM tableA
    GROUP BY serial, sku
)

如果您使用相同的数据更新问题,可以根据特定的数据库类型/版本进行改进。

答案 1 :(得分:1)

如果您使用的是SQL Server 2005及更新版本,则可以使用带有ROW_NUMBER构造的CTE:

;WITH DataForLastID AS
(
    SELECT 
        SERIAL, SKU, GRADE, ID,
        ROW_NUMBER() OVER(PARTITION BY SERIAL, SKU ORDER BY ID DESC) AS 'RowNum'
    FROM
       dbo.TABLEA
)
SELECT
    SERIAL, SKU, GRADE, ID
FROM
   DataForLastID
WHERE
    RowNum = 1

这会将您的数据“分区”Serial,SKU,Grade,并且对于每组相同的值,它将按顺序编号从1开始的行,按降序ID排序(因此最大/最新ID将为RowNum = 1)。

答案 2 :(得分:1)

由于GRADE是分组的一部分,因此无法获得所需的结果。看看数据:

SERIAL  SKU GRADE   ID
HA501   R2022   2   2011063
HA501   R2022   1   2011052
HA502   R2033   2   2011051
HA502   R2033   3   2011048
HA503   R2044   1   2011034
HA503   R2044   2   2011023

您希望取回SERIAL = HA501的以下行:

HA501   R2022   2   2011063

但是,该SERIAL / SKU有多个GRADE值。因此,您需要从GRADE中移除GROUP BY,否则您将获得SERIAL,SKU,GRADE的每个组合的MAX(ID)(在这种情况下,将会导致基本上每行返回。)

因此,正确的查询将如下所示:

SELECT SERIAL, SKU, MAX(id) as MaxID
FROM TABLEA
GROUP BY SERIAL, SKU

但是,这不包括GRADE列。如果您还需要返回相应的GRADE,则需要执行此操作(正如Cyber​​nate已经显示的那样):

SELECT SERIAL, SKU, GRADE, ID
FROM TABLEA
WHERE ID IN (SELECT MAX(ID) FROM TABLEA GROUP BY SERIAL, SKU)

它获取我们在上一个查询中建立的最大ID列表,并返回与这些ID匹配的所有数据。

或者,试试这个:

SELECT a.SERIAL, a.SKU, a.GRADE, a.ID
FROM TABLEA a
INNER JOIN (
   SELECT SERIAL, SKU, MAX(ID) as ID FROM TABLEA GROUP BY SERIAL, SKU) b
ON A.SERIAL = B.SERIAL AND A.SKU = B.SKU AND A.ID = B.ID

答案 3 :(得分:0)

In Group By具有不必要的开销。它将在每个循环中进行评估,并且每个循环都不需要MAX。如果ID在SERIAL中不唯一,SKU可能会导致意外输出

   SELECT TA1.SERIAL, TA1.SKU, TA1.GRADE, TA1.ID
   FROM TABLEA AS TA1
   WHERE TA1.ID = ( SELECT MAX(TA2.ID) 
                    FROM TABLEA AS TA2 
                    WHERE TA2.SERIAL = TA1.SERIAL 
                      AND TA2.SKU = TA1.SKU ) 
   ORDER BY TA1.SERIAL, TA1.SK