1

我有一张看起来像这样的桌子:-

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, SKU & GRADE我希望根据最新的 ID提取上述内容,如下所示:

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

4 回答 4

2

试试这个:

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

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

于 2011-08-13T12:55:12.433 回答
1

如果您使用的是 SQL Server 2005 和更新版本,您可以将 CTE 与ROW_NUMBER构造一起使用:

;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)。

于 2011-08-13T13:23:17.823 回答
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,否则您将获得MAX(ID)SERIAL、SKU、GRADE 的每个组合(在这种情况下,基本上会返回每一行)。

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

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
于 2011-08-13T13:35:00.353 回答
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
于 2011-08-13T18:32:50.910 回答