我想知道如何查询结果中字段的最新迭代。 例如,我写了一个查询,它将返回这个ID列表:
132GBD00
132GBD01
59RTW900
59RTW901
59RTW902
376BH200
376BH201
376BH202
376BH203
5789DD00
我希望查询返回此结果:
132GBD01
59RTW902
376BH203
5789DD00
请注意,类似的IDs
仅在最后两个字符中有所不同。 00是原来的,01,02等等。如果我写一个像:
SELECT memid
FROM MEMBERID
WHERE MEMBERID = ???
该表有日期,但我无法搜索不同的memid
并按max(date)
进行过滤,因为有时最新的迭代日期为NULL。我正在尝试查看是否可以查看ID列表并按ID中的最后两个字符过滤,以查看哪个更大并返回。
答案 0 :(得分:1)
显然,最后两个数字是序列号。您可以使用group by
select max(memid) as memid
from members
group by left(memid, len(memid) - 2);
如果您想要其他列,则可以使用row_number()
代替。
答案 1 :(得分:0)
试试这个
WITH cte AS (SELECT Memid
, ROW_NUMBER() OVER (PARTITION BY LEFT(Memid, LEN(Memid) - 2) ORDER BY memid DESC) AS Rownum
FROM MEMBERID
)
SELECT Memid
FROM cte
WHERE Rownum = 1;
答案 2 :(得分:0)
您可以使用row_number,如下所示:
Select top(1) with ties * from Members
Order by Row_Number() over (partition by SUBSTRING(memid, 1, len(memid)-2) order by convert(int,substring(memid, len(memid)-1, 2)) desc)
或外部查询如下:
Select MemId from (
Select *, RowN = Row_Number() over (partition by SUBSTRING(memid, 1, len(memid)-2) order by convert(int,substring(memid, len(memid)-1, 2)) desc)
from Members
) a Where a.RowN = 1
还有其他列
答案 3 :(得分:0)
我使用你的数据创建了一个临时表。这是一个非常简单的方法:
CREATE TABLE #Values (
SomeValue varchar(20)
);
INSERT INTO #Values
SELECT '132GBD00';
INSERT INTO #Values
SELECT '132GBD01';
INSERT INTO #Values
SELECT '59RTW900';
INSERT INTO #Values
SELECT '59RTW901';
INSERT INTO #Values
SELECT '59RTW902';
INSERT INTO #Values
SELECT '376BH200';
INSERT INTO #Values
SELECT '376BH201';
INSERT INTO #Values
SELECT '376BH202';
INSERT INTO #Values
SELECT '376BH203';
INSERT INTO #Values
SELECT '5789DD00';
SELECT DISTINCT
LAST_VALUE(SUBSTRING(SomeValue, 1, 6)) OVER (PARTITION BY SUBSTRING(SomeValue, 1, 6) ORDER BY SomeValue) AS LasID
FROM #Values