Как найти максимальный символ, используя подстроку - PullRequest
1 голос
/ 17 апреля 2019

Это должно быть относительно легко.Я смотрю на данные претензий для жизниУ меня есть следующий гипотетический ClaimID: 17060C048388A3

Немного об этом, A в 14-м символьном пространстве обозначает «Корректировка» со следующим числом, являющимся количеством времени, которое было скорректировано.Так, например, эта конкретная претензия была скорректирована 3 раза.К сожалению, ClaimID 17060C048388A1, 17060C048388A2 и 17060C048388A3 (показаны все три корректировки).Как выбрать только самую высокую корректировку, чтобы избежать дублирования при подсчете этих претензий.Не все претензии корректируются, поэтому у них не все буквы A и не все 15 символов.

Поэтому я думаю, что мне нужно начинать инструкцию case следующим образом:

SELECT DISTINCT TOP 10000 *,
    CASE WHEN CLAIMID LIKE '%A%' THEN ??????

Любойпредложения по получению следующей самой высокой цифры после «A» в ClaimID, если в ClaimID есть «A».Так что, если претензия имеет 8 корректировок, я хочу видеть только ту, которая заканчивается на A8.

Заранее спасибо, ребята, Грег

Ответы [ 4 ]

0 голосов
/ 17 апреля 2019

Это то, что сработало для меня (при условии, что я не замечаю никаких ошибок). Я взял примеры из всех комментариев и собрал их вместе, так что спасибо всем, кто ответил.

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

Я заметил, что А может быть 13-м или 14-м символом.

0 голосов
/ 17 апреля 2019

это будет работать еще проще;

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

проверьте это: http://sqlfiddle.com/#!4/cb16f/7

0 голосов
/ 17 апреля 2019

С 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 
0 голосов
/ 17 апреля 2019

Я снова посмотрел на ваш вопрос и создал следующее решение:

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

демо на dbfiddle.uk

...