【问题标题】:How can I query only the latest iteration?如何只查询最新的迭代?
【发布时间】:2017-11-11 23:15:50
【问题描述】:

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

【问题讨论】:

  • 这表明设计出了问题。您将两个值塞进一个违反 1NF 并且是要处理的严重 PITA 的单个元组中。您可能可以在此处利用 ROW_NUMBER,但您必须按子字符串进行分区。
  • 可能的错字:FROM MEMBERIDWHERE MEMBERID = ??? 相当奇怪。两个地方都有表名?

标签: sql sql-server tsql filter


【解决方案1】:

显然,最后两个数字是序列号。您可以通过group by 获取最新的:

select max(memid) as memid
from members
group by left(memid, len(memid) - 2);

如果您想要其他列,那么您可以使用 row_number()

【讨论】:

    【解决方案2】:

    试试这个

    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;
    

    【讨论】:

      【解决方案3】:

      你可以使用如下的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
      

      其他栏目也是如此

      【讨论】:

        【解决方案4】:

        我使用您的数据创建了一个临时表。这是一个非常简单的方法:

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-03
          • 2018-08-07
          • 2016-07-23
          相关资源
          最近更新 更多