我有一张如下表: -
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
但不知何故输出似乎不对。
有人可以帮助我吗?
感谢。
答案 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
,则需要执行此操作(正如Cybernate已经显示的那样):
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