Выберите предел Max 1 из группы

Я делаю в системе кэша веб-страницы. Я хотел заставить простую страницу оценить систему наряду с выводом. Проблема, я хочу отобразить recordset с самым высоким счетом уместности на уникальный домен. Один домен может иметь несколько записей, но с различными заголовками, описаниями, и т.д. Проблема, вместо того, чтобы получить 1 recordset, содержащий уникальный домен, это группирует весь recordsets того уникального домена и производит их всех. Я просто хочу recordset с самым высоким счетом уместности на уникальный домен на группу, прежде чем это произведет следующее (и другой домен с самой высокой уместностью для той группы)

SELECT title, html, sum(relevance) FROM
  (
  SELECT title, html, 10 AS relevance FROM page WHERE title like ‘%about%’ UNION
  SELECT title, html, 7 AS relevance FROM page WHERE html like ‘%about%’ UNION
  SELECT title, html, 5 AS relevance FROM page WHERE keywords like ‘%about%’ UNION
  SELECT title, html, 2 AS relevance FROM page WHERE description like ‘%about%’
  ) results
GROUP BY title, html
ORDER BY relevance desc;

Я добираюсь:

domain1 title html
domain1 title html
domain1 title html
domain2 title html
domain2 title html
domain2 title html

То, что я хочу,

domain1 title html
domain2 title html
domain3 title html
domain4 title html
domain5 title html
7
задан ekad 27 January 2017 в 11:06
поделиться

2 ответа

Я не уверен, почему ваш код вообще работает, поскольку я думаю, что у вас должно быть

ORDER BY Sum(relevance) DESC

вместо

ORDER BY relevance DESC

Может в этом проблема?

Кроме этого, что насчет этого. Это уродливо, но это будет работать. Было бы лучше, если бы SQL Server понимал, как ссылаться на псевдонимы далее в запросе. Но увы.

SELECT title, html,
Case When title LIKE '%about%' Then 10 Else 0 End +
Case When html LIKE '%about%' Then 7 Else 0 End +
Case When keywords LIKE '%about%' Then 5 Else 0 End +
Case When description LIKE '%about%' Then 2 Else 0 End AS relevance
FROM page
WHERE Case When title LIKE '%about%' Then 10 Else 0 End +
Case When html LIKE '%about%' Then 7 Else 0 End +
Case When keywords LIKE '%about%' Then 5 Else 0 End +
Case When description LIKE '%about%' Then 2 Else 0 End > 0
ORDER BY Case When title LIKE '%about%' Then 10 Else 0 End +
Case When html LIKE '%about%' Then 7 Else 0 End +
Case When keywords LIKE '%about%' Then 5 Else 0 End +
Case When description LIKE '%about%' Then 2 Else 0 End DESC;

Или, может быть, просто небольшая перестановка:

SELECT title, html, relevance
FROM (SELECT title, html,
Case When title LIKE '%about%' Then 10 Else 0 End +
Case When html LIKE '%about%' Then 7 Else 0 End +
Case When keywords LIKE '%about%' Then 5 Else 0 End +
Case When description LIKE '%about%' Then 2 Else 0 End AS relevance
FROM page)
WHERE relevance > 0
ORDER BY relevance DESC;
2
ответ дан 7 December 2019 в 18:39
поделиться

ORDER BY relevance заставляет ваш запрос вести себя так, как будто релевантность (не агрегированная) находится в предложении SELECT. Erick прав - ORDER BY sum(relevance) должен исправить вашу ошибку.

0
ответ дан 7 December 2019 в 18:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: