SQL: ВЫБРАТЬ n% с изображениями, (100-n)% без изображений - PullRequest
2 голосов
/ 11 августа 2009

у нас есть БД, в которой хранятся пользователи, у которых могут быть изображения.

Я ищу элегантный способ в SQL, чтобы получить следующие результаты: Выберите n пользователей. Из этих n пользователей, например 60% должны иметь ассоциированное изображение, а 40% не должны иметь изображение. Если у пользователя менее 60% изображений, результат должен быть заполнен пользователями без изображения.

Есть ли какой-нибудь элегантный способ в SQL без запуска нескольких SELECT в БД?

Большое спасибо.

Ответы [ 4 ]

2 голосов
/ 11 августа 2009

Таким образом, вы указываете число @n, которое вы хотите. Вы предоставляете @x в процентах от тех пользователей, у которых должны быть изображения.

select top (@n) *
from
(
select top (@n * @x / 100) *
from users
where picture is not null 

union all

select top (@n) *
from users
where picture is null 
) u
order by case when picture is not null then 1 else 2 end;

Итак ... вам нужно не более @n * @x / 100 пользователей, у которых есть картинки, а остальные должны быть людьми, у которых нет картинок. Таким образом, я делаю «союз всех» между моими @ n * @ x / 100 картинными людьми и достаточным количеством других, чтобы завершить мой @n. Затем я отбираю их обратно, заказываю свой ТОП, чтобы убедиться, что у меня есть люди, у которых есть фотография.

Rob

Отредактировано: На самом деле, это было бы лучше:

select top (@n) *
from
(
select top (@n * @x / 100) *, 0 as NoPicture
from users
where picture is not null 

union all

select top (@n) *, 1 as NoPicture
from users
where picture is null 
) u
order by NoPicture;

... потому что это устраняет влияние ORDER BY.

0 голосов
/ 11 августа 2009

Используйте вариант выбора для этого типа требования.

0 голосов
/ 11 августа 2009

Гадкий код:

SELECT TOP @n * FROM
(


      //-- We start selecting users who have a picture (ordered by HasPicture)
      //-- If there is no more users with a picture, this query will fill the 
      //-- remaining rows with users without a picture
      SELECT TOP 60 PERCENT * FROM tbUser
      ORDER BY HasPicture DESC

      UNION

      //-- This is to make sure that we select at least 40% users without a picture
      //-- AT LEAST because in the first query it is possible that users without a 
      //-- picture have been selected
      SELECT TOP 40 PERCENT * FROM tblUser
      WHERE HasPicture = 0

      //-- We need to avoid duplicates because in the first select query we haven't 
      //-- specified HasPicture = 1 (and we didn't want to).
      AND UserID not IN
      (
        SELECT TOP 60 PERCENT UserID FROM tbUser
        ORDER BY HavePicture DESC
      )
 )
0 голосов
/ 11 августа 2009
SELECT TOP(n) HasPicture --should be 0 or 1 to allow ORDER
   FROM Users
   ORDER BY 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...