У меня это работает следующим образом. Это для DDL и примеров данных.
CREATE TABLE orders
([orderNumber] varchar(5), [customer] int, [createDate] datetime)
;
INSERT INTO orders
([orderNumber], [customer], [createDate])
VALUES
('001', 123, '2019-01-01 00:00:00'),
('002', 123, '2019-01-23 00:00:00'),
('003', 456, '2019-03-12 00:00:00'),
('003R1', 456, '2019-03-22 00:00:00'),
('004', 456, '2019-04-25 00:00:00'),
('005', 789, '2019-05-21 00:00:00'),
('005A1', 789, '2019-06-30 00:00:00'),
('005R1', 789, '2019-07-12 00:00:00')
;
И это фактический запрос:
WITH ordersCTE AS (
SELECT *, PATINDEX('%[a-z]%', orderNumber) AS firstLetterPosition
FROM orders AS O)
, ComputedOrderNumber AS (
SELECT *, CAST(CASE firstLetterPosition
WHEN 0 THEN orderNumber
ELSE LEFT(orderNumber, firstLetterPosition -1)
END AS INT) as actualOrderNumber
FROM ordersCTE)
, Ordered AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY actualOrderNumber ORDER BY createDate DESC) AS RN
FROM ComputedOrderNumber
)
SELECT *
FROM Ordered
WHERE RN = 1
Это попытается извлечь идентификатор, прежде чем игнорировать любые буквы в orderNumber
, а затем использоватьэто для разделения данных.
Но я бы настоятельно рекомендовал иметь соответствующий столбец для хранения корня orderNumber
, вычисление которого каждый раз будет очень дорогим.