Подтвердить что ты не робот

SQL Server Выберите лучшие 10-20 результатов?

У меня есть два столбца: первый из них - лучшие 10 продуктов (1-10)

Это

SELECT TOP 10 * FROM Product   

Во втором столбце я хочу следующие 10 результатов (11-20)

Как это сделать?

4b9b3361

Ответ 1

WITH T AS
(
SELECT TOP 20 name, 
       row_number() OVER (ORDER BY id) AS RN
FROM Products
ORDER BY id
)
SELECT 
       MAX(CASE WHEN RN <=10 THEN name END) AS Col1,
       MAX(CASE WHEN RN > 10 THEN name END) AS Col2
FROM T       
GROUP BY RN % 10

Ответ 2

Я бы сделал это:

SELECT [columns] FROM [table names] ORDER BY [column name] DESC LIMIT 10 OFFSET 10;

Это проще и менее сложно....

Что вы, ребята, думаете?

Ответ 3

select top 10 wwwhid from wwwh  where wwwhid not in(select top 10 wwwhid from wwwh)

Ответ 4

В SQL Server это немного сложно сделать, чтобы это сделать. Если вы работаете на SQL Server 2005 или новее, вы можете использовать CTE с CROSS JOIN и некоторые трюки, чтобы получить результат, который вы ищете:

;WITH TopProducts AS
(
    SELECT 
        ProductID, ProductName,
        ROW_NUMBER() OVER(ORDER BY --some-column-here-- DESC) 'RN'
    FROM dbo.Products
)
SELECT 
    p1.ProductID, p1.ProductName,
    p2.ProductID, p2.ProductName
FROM 
    TopProducts p1
CROSS JOIN 
    TopProducts p2
WHERE 
    p1.RN BETWEEN 1 AND 10        -- get rows 1-10 from the first CTE
    -- AND p2.RN BETWEEN 11 AND 20   redundant, as niktrs pointed out
    AND p1.RN + 10 = p2.RN        -- join rows from P1 and P2 so you don't get a cartesian product

CTE (Common Table Expression) отображает продукты - это должно основываться на некотором столбце из таблицы Products, но вы не указали, какой столбец определяет порядок.

Затем мы выбираем строки 1-10 из CTE, а также строки 11-20 из второго экземпляра CTE. Если вы оставите это как есть, вы получите 100 строк - каждая комбинация строк 1-10 из первого набора результатов по каждому из 10 строк из второго результирующего набора.

Для этого вам нужно дополнительное условие, основанное на номерах строк, для "объединения" одной строки из каждого набора результатов, и таким образом вы получите десять строк - первый столбец содержит элементы 1-10 из таблицы "Продукты", второй столбец имеет строки 11-20

Ответ 5

Я не уверен, что это лучший способ сделать это, но он работает

select *
from
(
SELECT top 10 ROW_NUMBER() OVER(ORDER BY product) linenum, product
FROM products
) t1
 JOIN 
(
SELECT top 20 ROW_NUMBER() OVER(ORDER BY product) linenum, product
FROM products
) t2 ON t1.linenum+10 = t2.linenum

Ответ 6

declare @FromRange int
declare @ToRange int
set @FromRange =11
set @ToRange =20
SELECT top(@[email protected]+1) * FROM [tbl] 
where tbl_id not in (select top (@FromRange-1) tbl_id from tbl)
ORDER BY tbl_id 

Ответ 7

SELECT * FROM Product LIMIT(10,10)

Ответ 8

Попробуйте следующее:

SELECT * 
FROM 
( 
    SELECT TOP 10 ROW_NUMBER() OVER(ORDER BY ColName) RowNo, ColName
    FROM TableName 
) table1 
INNER JOIN  
( 
    SELECT TOP 20 ROW_NUMBER() OVER(ORDER BY ColName) RowNo, ColName 
    FROM TableName 
) table2 ON table1.RowNo + 10 = table2.RowNo 

Ответ 9

WITH result_set AS 
    (SELECT ROW_NUMBER() OVER 
        (ORDER BY Product.ID DESC) AS 
     [row_number], Product.intId AS id, Product.Title As Title
     FROM Product WHERE Product.Price > 11)
SELECT * FROM result_set WHERE [row_number] BETWEEN 10 AND 19 

Ответ 10

Используйте код:

select top 20 * from [table Name] 
except
select top 10 * from [table Name]

Ответ 11

SELECT p.* FROM 
(
 SELECT *, ROW_NUMBER() OVER (ORDER BY /*some column*/) AS row_num
 FROM Product
) AS p
WHERE p.row_num BETWEEN 11 AND 20

Ответ 12

select *
from (select *
      from <table>
      order by id asc)
where rownum <= 20

minus
select *
from (select *
      from <table>
      order by id asc)
where rownum <= 10

Ответ 13

Попробуйте следующее:

SELECT * FROM
  (SELECT ROW_NUMBER() OVER (ORDER BY ColumnName) AS MyRowNumber, *
  FROM TableName) tbl
WHERE MyRowNumber BETWEEN 20 AND 30