这应该相对容易。我以索赔数据为生。我有以下假设的ClaimID:17060C048388A3
关于这一点,第14个字符空间中的A代表“调整”,下面的数字是已调整的时间数。因此,例如,此特定索赔已经调整了3次。不幸的是,ClaimID 17060C048388A1,17060C048388A2和17060C048388A3(所有三个调整显示)。在计算这些声明时,我如何仅选择最高调整以避免重复。并非所有声明都经过调整,因此它们并非都具有A并且不是全部15个字符。
所以我想我需要开始一个案例陈述如下:
SELECT DISTINCT TOP 10000 *,
CASE WHEN CLAIMID LIKE '%A%' THEN ??????
如果ClaimID中有'A',那么在ClaimID中'A'之后抓取下一个最高位的任何建议。因此,如果索赔有8个调整,我只想看到以A8结尾的那个。
先谢谢你们,格雷格
有了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
见demo。 对于此示例数据:
> 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
这将更简单;
select * from Table1 where
regexp_like("column1",substr("column1",1,instr("column1",'A'))||
(select max(substr("column1",-1)) from Table1) );`
这对我有用(假设我没有注意到任何错误)。我从所有评论中抽取了例子并将它们放在一起,谢谢大家的回复。
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 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