Какой самый простой SQL-запрос для поиска второго по величине значения?

Я не верю, что это поддерживается. cudaMalloc() выделяет память устройства, но сохраняет адрес в переменной на хосте. В вашем for-loop вы передаете его адреса в памяти устройства.

В зависимости от того, что вы пытаетесь выполнить, вы можете выделить data с обычным хостом malloc() перед вызовом for -Лоп, как у тебя сейчас. Или выделите один большой блок памяти устройства и вычислите смещения в нем вручную.

Посмотрите на разделы 2.4, 3.2.1 и B.2.5 (внизу) руководства по программированию CUDA для более подробного обсуждения этого. В частности, в нижней части страницы 108:

Адрес, полученный с помощью адреса переменной __device__, __shared__ или __constant__, может использоваться только в коде устройства.

blockquote>

149
задан Mark 30 August 2016 в 00:13
поделиться

11 ответов

SELECT MAX( col )
  FROM table
 WHERE col < ( SELECT MAX( col )
                 FROM table )
272
ответ дан Matt Rogish 30 August 2016 в 00:13
поделиться

Что-то вроде этого? Я не протестировал его, хотя:

select top 1 x
from (
  select top 2 distinct x 
  from y 
  order by x desc
) z
order by x
0
ответ дан doekman 30 August 2016 в 00:13
поделиться

Это работает в SQL MS:

select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] < 
 ( select max([COLUMN_NAME]) from [TABLE_NAME] )
0
ответ дан sth 30 August 2016 в 00:13
поделиться

В T-Sql существует два пути:

--filter out the max
select max( col )
from [table]
where col < ( 
    select max( col )
    from [table] )

--sort top two then bottom one
select top 1 col 
from (
    select top 2 col 
    from [table]
    order by col) topTwo
order by col desc 

В Microsoft SQL первый путь дважды с такой скоростью, как второе, даже если рассматриваемый столбец кластеризируется.

Это вызвано тем, что операция вида является относительно медленной по сравнению с таблицей или индексным сканированием, которое max использует агрегирование.

, С другой стороны, в Microsoft SQL 2005 и выше Вас может использовать эти ROW_NUMBER() функция:

select col
from (
    select ROW_NUMBER() over (order by col asc) as 'rowNum', col
    from [table] ) withRowNum 
where rowNum = 2
30
ответ дан Keith 30 August 2016 в 00:13
поделиться

Самое легкое должно было бы получить второе значение от этого набора результатов в приложении:

SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2

, Но если необходимо выбрать второе значение с помощью SQL, как насчет:

SELECT MIN(value) FROM (SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2) AS t
6
ответ дан Magnar 30 August 2016 в 00:13
поделиться

Я вижу и некоторых определенных для SQL Server и некоторый MySQL определенные решения здесь, таким образом, Вы могли бы хотеть разъясниться, в какой базе данных Вы нуждаетесь. Хотя, если бы я должен был предположить, что сказал бы SQL Server, так как это тривиально в MySQL.

я также вижу некоторые решения, которые не будут работать, потому что они не удаются принять во внимание возможность для дубликатов, так осторожны, которые Вы принимаете. Наконец, я вижу некоторых, которые будут работать, но это сделает два полных сканирования таблицы. Вы хотите удостовериться, что 2-е сканирование только смотрит на 2 значения.

SQL Server (пред2012):

SELECT MIN([column]) AS [column]
FROM (
    SELECT TOP 2 [column] 
    FROM [Table] 
    GROUP BY [column] 
    ORDER BY [column] DESC
) a

MySQL:

SELECT `column` 
FROM `table` 
GROUP BY `column` 
ORDER BY `column` DESC 
LIMIT 1,1

Обновление:

SQL Server 2012 теперь поддерживает намного более чистый (и стандарт ) синтаксис СМЕЩЕНИЯ/ВЫБОРКИ:

SELECT TOP 2 [column] 
FROM [Table] 
GROUP BY [column] 
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;
17
ответ дан Joel Coehoorn 30 August 2016 в 00:13
поделиться

Я предполагаю, что можно сделать что-то как:

SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1

или

SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1)

в зависимости от Вашего сервера базы данных. Подсказка: SQL Server не делает ПРЕДЕЛА.

12
ответ дан dguaraglia 30 August 2016 в 00:13
поделиться
select top 1 MyIntColumn from MyTable
where
 MyIntColumn <> (select top 1 MyIntColumn from MyTable order by MyIntColumn desc)
order by MyIntColumn desc
0
ответ дан sth 30 August 2016 в 00:13
поделиться

См. , Как выбрать энную строку в таблице базы данных SQL? .

SQL Sybase Где угодно поддерживает:

SELECT TOP 1 START AT 2 value from table ORDER BY value
0
ответ дан Community 30 August 2016 в 00:13
поделиться
select * from emp e where 3>=(select count(distinct salary)
    from emp where s.salary<=salary)

Этот запрос выбирает три максимальные зарплаты. Если два сотрудника получают одинаковую зарплату, это не влияет на запрос.

0
ответ дан 23 November 2019 в 21:42
поделиться

Использование коррелированного запроса:

Select * from x x1 where 1 = (select count(*) from x where x1.a < a)
0
ответ дан 23 November 2019 в 21:42
поделиться
Другие вопросы по тегам:

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