如何只查询最新的迭代?

时间:2017-06-09 20:28:07

标签: sql sql-server tsql filter

我想知道如何查询结果中字段的最新迭代。 例如,我写了一个查询,它将返回这个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中的最后两个字符过滤,以查看哪个更大并返回。

4 个答案:

答案 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