Выберите по длине символов - PullRequest
0 голосов
/ 15 мая 2019

Я должен выбрать самую длинную фразу, которая имеет points>0, но содержится во фразе, которая имеет points=0, если вы посмотрите на демонстрацию, строки в выходных данных будут номерами 3 и 6:

http://sqlfiddle.com/#!18/e954f/1/0

большое спасибо заранее.

Ответы [ 3 ]

1 голос
/ 15 мая 2019

Вы можете использовать CTE, чтобы найти все фразы с положительными точками, которые являются подстрокой фразы с 0 точками.Затем вы можете найти максимальную длину подстрок, связанных с каждой 0-точечной фразой, и JOIN, которые возвращаются в CTE, чтобы получить фразу, соответствующую этому условию:

WITH cte AS (
SELECT w1.*, w2.id AS w2_id
FROM words w1
JOIN (SELECT * 
      FROM words
      WHERE points = 0) w2 ON w1.phrase = LEFT(w2.phrase, LEN(w1.phrase))
WHERE w1.points > 0
)
SELECT cte.id, cte.phrase, points
FROM cte
JOIN (SELECT w2_id, MAX(LEN(phrase)) AS max_len
      FROM cte
      GROUP BY w2_id) cte_max ON cte_max.w2_id = cte.w2_id AND cte_max.max_len = LEN(cte.phrase)

Вывод:

id  phrase              points
3   tool box online     1
6   stone road          1

Обновлен SQLFiddle

1 голос
/ 15 мая 2019

Вы можете использовать внутреннее объединение, сравнивая фразы с LIKE, чтобы получить только те, которые содержатся в другой фразе.Фильтр для точки в предложении WHERE.Затем получите rank(), разделенный на фразу из объединенного экземпляра и упорядоченный по убыванию длины.Во внешнем SELECT получают только те, которые имеют ранг 1.

SELECT x.id,
       x.phrase,
       x.points
       FROM (SELECT w1.id,
                    w1.phrase,
                    w1.points,
                    rank() OVER (PARTITION BY w2.phrase
                                 ORDER BY len(w1.phrase) DESC) r
                    FROM words w1
                         INNER JOIN words w2
                                    ON w2.phrase LIKE concat(w1.phrase, '%')
                    WHERE w2.points = 0
                          AND w1.points > 0) x
       WHERE x.r = 1;

SQL Fiddle


Редактировать:

Включить другую фразу:

SELECT x.id,
       x.phrase,
       x.other_phrase,
       x.points
       FROM (SELECT w1.id,
                    w1.phrase,
                    w2.phrase other_phrase,
                    w1.points,
                    rank() OVER (PARTITION BY w2.phrase
                                 ORDER BY len(w1.phrase) DESC) r
                    FROM words w1
                         INNER JOIN words w2
                                    ON w2.phrase LIKE concat(w1.phrase, '%')
                    WHERE w2.points = 0
                          AND w1.points > 0) x
       WHERE x.r = 1;
0 голосов
/ 15 мая 2019

Вы получите от максимальной до минимальной длины фразы, где points>0

SELECT *, LEN(phrase) AS Lenght FROM words where points>0 ORDER BY LEN(phrase) DESC

И если вы хотите самую длинную фразу

 SELECT TOP 1 *, LEN(phrase) AS Lenght FROM words where points>0 ORDER BY LEN(phrase) DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...