あなたは文がID番号の昇順で形成されていると仮定しています。それは本当に悪い考えです。
このクエリは、文の区切りに関する情報を提供するはずです。(「T」を実際のテーブル名に置き換えます。)
SELECT
Break1.Id as BreakId,
COALESCE(MAX(Break2.Id), 0) as PreviousBreakId,
COALESCE(COUNT(Break2.Id), 0) + 1 as BreakNumber
FROM
(SELECT Id FROM T WHERE Word LIKE '%.') as Break1,
(SELECT Id FROM T WHERE Word LIKE '%.') as Break2
WHERE Break2.Id < Break1.Id
GROUP BY Break1.Id
UPDATEで使用する方法は次のとおりです。
UPDATE T
SET SentenceNum = (
SELECT B.BreakNumber
FROM
(
SELECT
Break1.Id as BreakId,
COALESCE(MAX(Break2.Id), 0) as PreviousBreakId,
COALESCE(COUNT(Break2.Id), 0) + 1 as BreakNumber
FROM
(SELECT Id FROM T WHERE Word LIKE '%.') as Break1,
(SELECT Id FROM T WHERE Word LIKE '%.') as Break2
WHERE
Break2.Id < Break1.Id
GROUP BY Break1.Id
) as B
WHERE T.Id >= B.PreviousBreak AND T.Id < B.BreakId
)
私は教育的価値についての質問を提供しますが、あなたの情報に基づいたアプローチを容認することはできません。
編集
基本的にロジックが存在しない前の文の切れ目を探すため、私の元のバージョンでは最初の文に問題がありました。@cravooriのソリューションは、左結合を介してこれを処理します。これは、私自身の答えと同じ精神で動作するバージョンであり、区切りではなく単語の完全なリストを返します。クロス結合とダミーのゼロ行を除いて、基本的には同じです。
SELECT T.Id, MIN(T.Word) as Word, COUNT(Breaks.Id) as SentenceNumber
FROM T, (SELECT 0 as Id UNION ALL SELECT Id FROM T WHERE Word LIKE '%.') as Breaks
WHERE Breaks.Id < T.Id
GROUP BY T.Id;