Sql 如何使用子字符串查找最大字符数

Sql 如何使用子字符串查找最大字符数,sql,sql-server,case,sql-like,sql-server-2016,Sql,Sql Server,Case,Sql Like,Sql Server 2016,这应该相对容易。我以查看索赔数据为生。我有以下假设性索赔:17060C048388A3 关于这一点,第14个字符空间中的A代表“调整”,下面的数字是调整的时间数。例如,这个具体的索赔已经调整了3次。 不幸的是,索赔为17060C048388A1、17060C048388A2和17060C048388A3(三次调整均显示)。如何在计算这些索赔时仅选择最高调整以避免重复。并不是所有的声明都经过了调整,所以它们不都是A,也不都是15个字符 因此,我认为我需要开始一个案例陈述,如下所示: SELECT

这应该相对容易。我以查看索赔数据为生。我有以下假设性索赔:17060C048388A3

关于这一点,第14个字符空间中的A代表“调整”,下面的数字是调整的时间数。例如,这个具体的索赔已经调整了3次。 不幸的是,索赔为17060C048388A1、17060C048388A2和17060C048388A3(三次调整均显示)。如何在计算这些索赔时仅选择最高调整以避免重复。并不是所有的声明都经过了调整,所以它们不都是A,也不都是15个字符

因此,我认为我需要开始一个案例陈述,如下所示:

SELECT DISTINCT TOP 10000 *,
    CASE WHEN CLAIMID LIKE '%A%' THEN ??????
如果ClaimID中有“A”,是否有任何关于在ClaimID中抓住“A”之后的下一个最高数字的建议。因此,如果索赔有8个调整,我只想看到以A8结尾的调整

提前谢谢各位,
Greg

我再次查看了您的问题,并创建了以下解决方案:

SELECT base, MAX(adjustment) AS max_adjustment, base + IIF(MAX(adjustment) > 0, 'A', '') + MAX(adjustment) max_adjusted_claim
FROM (
  SELECT 
    IIF(PATINDEX('%A%', ClaimID) = 0, ClaimID, LEFT(ClaimID, PATINDEX('%A%', ClaimID)-1)) AS base, 
    REPLACE(REVERSE(LEFT(REVERSE(ClaimID), PATINDEX('%A%', REVERSE(ClaimID)))), 'A', '') AS adjustment
  FROM table_name
)t GROUP BY base

我再次查看了您的问题,并创建了以下解决方案:

SELECT base, MAX(adjustment) AS max_adjustment, base + IIF(MAX(adjustment) > 0, 'A', '') + MAX(adjustment) max_adjusted_claim
FROM (
  SELECT 
    IIF(PATINDEX('%A%', ClaimID) = 0, ClaimID, LEFT(ClaimID, PATINDEX('%A%', ClaimID)-1)) AS base, 
    REPLACE(REVERSE(LEFT(REVERSE(ClaimID), PATINDEX('%A%', REVERSE(ClaimID)))), 'A', '') AS adjustment
  FROM table_name
)t GROUP BY base

这将更加简单

select * from Table1 where
regexp_like("column1",substr("column1",1,instr("column1",'A'))||
            (select max(substr("column1",-1)) from Table1) );`

检查此项:

此项操作将更加简单

select * from Table1 where
regexp_like("column1",substr("column1",1,instr("column1",'A'))||
            (select max(substr("column1",-1)) from Table1) );`
检查此项:

使用CTE:

with cte as(
  select
    claimid,
    case 
      when claimid like '%A%' then left(claimid, charindex('A', claimid) - 1) 
      else claimid
    end claim,
    case 
      when claimid like '%A%' then cast(right(claimid, len(claimid) - charindex('A', claimid)) as int)
      else 0
    end adjustment
  from tablename
)
select distinct top 10000 t.* 
from tablename t inner join (
  select 
    claim + 
    case max(adjustment) 
      when 0 then ''
      else 'A' + cast(max(adjustment) as varchar(10))
    end claimid 
  from cte
  group by claim
) g on g.claimid = t.claimid
请参阅。
对于此示例数据:

> claimid        | value
> :------------- | :----
> 17060C048388A1 | a    
> 17060C048388A2 | b    
> 17060C04838811 | c    
> 17060C04838866 | d    
> 17060C04838855 | e    
> 17060C048388A3 | f    
> 17060C04838899 | g 
结果是:

> claimid        | value
> :------------- | :----
> 17060C04838811 | c    
> 17060C04838866 | d    
> 17060C04838855 | e    
> 17060C048388A3 | f    
> 17060C04838899 | g 
使用CTE:

with cte as(
  select
    claimid,
    case 
      when claimid like '%A%' then left(claimid, charindex('A', claimid) - 1) 
      else claimid
    end claim,
    case 
      when claimid like '%A%' then cast(right(claimid, len(claimid) - charindex('A', claimid)) as int)
      else 0
    end adjustment
  from tablename
)
select distinct top 10000 t.* 
from tablename t inner join (
  select 
    claim + 
    case max(adjustment) 
      when 0 then ''
      else 'A' + cast(max(adjustment) as varchar(10))
    end claimid 
  from cte
  group by claim
) g on g.claimid = t.claimid
请参阅。
对于此示例数据:

> claimid        | value
> :------------- | :----
> 17060C048388A1 | a    
> 17060C048388A2 | b    
> 17060C04838811 | c    
> 17060C04838866 | d    
> 17060C04838855 | e    
> 17060C048388A3 | f    
> 17060C04838899 | g 
结果是:

> claimid        | value
> :------------- | :----
> 17060C04838811 | c    
> 17060C04838866 | d    
> 17060C04838855 | e    
> 17060C048388A3 | f    
> 17060C04838899 | g 

这就是我的工作原理(假设我没有注意到任何bug)。我从所有的评论中选取了一些例子,并把它们放在一起,所以感谢所有回复的人

SELECT DISTINCT SUBSTRING(CLAIMID, 1,13) + MAX(RIGHT(CLAIMID, 2)) AS 
MAX_CLAIM_ADJUSTMENT
FROM LA_TEMP.DBO.ITEM19
WHERE (SUBSTRING(CLAIMID, 14, 1) = 'A'
OR SUBSTRING(CLAIMID, 13, 1) = 'A')
GROUP BY left(CLAIMID, 13)
UNION
SELECT DISTINCT SUBSTRING(CLAIMID, 1,14) + MAX(RIGHT(CLAIMID, 1)) AS 
MAX_CLAIM_ADJUSTMENT
FROM LA_TEMP.DBO.ITEM19
WHERE (SUBSTRING(CLAIMID, 15, 1) = 'A'
OR SUBSTRING(CLAIMID, 14, 1) = 'A')
GROUP BY left(CLAIMID, 14)
ORDER BY MAX_CLAIM_ADJUSTMENT

我注意到A可以是第13个或第14个字符。

这对我来说很有用(假设我没有注意到任何错误)。我从所有的评论中选取了一些例子,并把它们放在一起,所以感谢所有回复的人

SELECT DISTINCT SUBSTRING(CLAIMID, 1,13) + MAX(RIGHT(CLAIMID, 2)) AS 
MAX_CLAIM_ADJUSTMENT
FROM LA_TEMP.DBO.ITEM19
WHERE (SUBSTRING(CLAIMID, 14, 1) = 'A'
OR SUBSTRING(CLAIMID, 13, 1) = 'A')
GROUP BY left(CLAIMID, 13)
UNION
SELECT DISTINCT SUBSTRING(CLAIMID, 1,14) + MAX(RIGHT(CLAIMID, 1)) AS 
MAX_CLAIM_ADJUSTMENT
FROM LA_TEMP.DBO.ITEM19
WHERE (SUBSTRING(CLAIMID, 15, 1) = 'A'
OR SUBSTRING(CLAIMID, 14, 1) = 'A')
GROUP BY left(CLAIMID, 14)
ORDER BY MAX_CLAIM_ADJUSTMENT

我注意到A可以是第13个或第14个字符。

您使用的是哪种dbms(mysql、sql server、oracle、postgres)?请标记您的问题。Sql_Server 2016管理研究如果上面不清楚,表示调整的“A”并不总是位于第14位。你们对此有何看法。从数据来看,“A”可以落在第13位或第14位。这不应该起作用吗
`
选择不同的claimid
当子字符串(claimid,14,1)='A'然后Max(claimid)
当子字符串(claimid,13,1)='A'然后Max(claimid)结束时作为MaxClaimID
从PLANREPORT_QNXT_LA.DBO.CLAIM中选择(mysql、sql server、oracle、postgres)您正在使用?请标记您的问题。Sql_Server 2016管理研究如果上面不清楚,表示调整的“A”并不总是落在第14位。大家对此有何看法。查看数据,“A”可以落在第13位或第14位。这不应该起作用吗?
`
选择不同的claimid
当子字符串(CLAIMID,14,1)='A'然后Max(CLAIMID)时的情况
当子字符串(CLAIMID,13,1)='A'然后Max(CLAIMID)从PLANREPORT_QNXT_LA.DBO.CLAIM中以MaxClaimID结尾
,CLAIMID喜欢“%A%”
按CLAIMID分组
如果上面不清楚,表示调整的“A”并不总是位于第14位。@GregoryBraininger-我更新了我的解决方案,现在应该可以解决很多问题了(查看带有一些测试值的演示)。如果上面不清楚,则表示调整的“a”并不总是位于第14位。@GregoryBraininger-我更新了我的解决方案,现在应该适用于许多可能性(查看带有一些测试值的演示)。如果A后面的数字大于1位,则代码将失败,因为您将该数字作为字符串获取,因此如果存在A10,则代码将以最大值获取A9。如果A后面的数字大于1位,则代码将失败,因为您将该数字作为字符串获取,因此如果存在A10,则代码将以最大值获取A9。