Пожалуйста, найдите ниже изображение, чтобы понять мои проблемы. У меня есть таблица, как показано ниже. Мне нужно получить только выделенные (желтые) записи. Каков наилучший способ найти эти записи?Найти записи в SQL Server 2008 R2
ответ
вот код, который вы можете запустить в SQL сервере
select * from Table_name where id in (1,2,6,7,195,160,164,165)
:) Я хочу узнать на основе типа карты и последовательности записей. –
Возможно, вы могли бы написать ответ, который работает даже для общих данных, т. Е. Без указания этих значений id ...? – jarlh
В SQL Server 2012+, вы можете использовать lead()
и lag()
функции. Однако, это не доступно в SQL Server 2008. Здесь является метод с использованием outer apply
:
select t.*
from t outer apply
(select top 1 tprev.*
from t tprev
on tprev.time < t.time
order by tprev.time desc
) tprev outer apply
(select top 1 tnext.*
from t tnext
on tnext.time > t.time
order by tnext.time asc
)
where (t.cardtype = 1 and tnext.cardtype = 2) or
(t.cardtype = 2 and tprev.cardtype = 1);
С вашими данными выборки, также было бы возможно использовать самостоятельно включается на id
колонке. Однако это кажется небезопасным, поскольку в этих значениях столбцов могут быть пробелы.
O.O, что сложный запрос: D –
Havent попробовал это, но я думаю, что он должен работать. Во-первых, сделать вид таблицы в вашем вопросе, с RowNumber включены в одну колонку:
CREATE VIEW v AS
SELECT
ROW_NUMBER() OVER(ORDER BY id) AS rownum,
id,
time,
card,
card_type
FROM table
Затем, вы можете получить все строки 1-го типа, за которым следует ряд 2-го типа, как это:
SELECT
a.id,
-- And so on...
FROM v AS a
JOIN v AS b ON b.rownum = a.rownum + 1
WHERE a.card_type = 1 AND b.card_type = 2
И все строки 2-го типа, которому предшествует ряд 1-го типа, как это:
SELECT
b.id,
-- And so on...
FROM v AS b
JOIN v AS a ON b.rownum = a.rownum + 1
WHERE a.card_type = 1 AND b.card_type = 2
Чтобы получить их обоих в одном наборе результатов, вы можете просто использовать UNION ALL
. Технически вам не нужен вид. Вместо этого вы можете использовать вложенные selects, но так как вам нужно будет четыре раза запросить таблицу, это может быть приятно иметь в качестве представления.
Кроме того, если идентификатор является непрерывным (он идет 1, 2, 3 без каких-либо зазоров), вам не нужен rownum и он может просто использовать идентификатор.
- 1. SQL Server 2008 R2: Избегайте наоборот записи
- 2. Повторяющиеся записи, показывающие SQL Server 2008 R2
- 3. SQL Server 2008 R2:
- 4. SQL Server 2008 R2: ROW_NUMBER()
- 5. SQLDependency SQL Server 2008 R2
- 6. Linked Server в SQL Server 2008 R2
- 7. SQL Server 2008 R2: IDENTITY
- 8. SQL Server 2008 R2 Trigger
- 9. ПОСЛЕДОВАТЕЛЬНОСТЬ в SQL Server 2008 R2
- 10. SQL Server 2008 R2 pagination
- 11. SQL Server 2008 R2 поворота
- 12. Обновление SQL Server 2008 до 2008 R2
- 13. Использование функций в SQL Server 2008 R2
- 14. Нормализация Unicode в SQL Server 2008 R2
- 15. SQL Server 2008 R2: Производительность запросов
- 16. SQL Server 2008 R2: Подготовка рекурсивный запрос
- 17. Не удалось найти полнотекстовый поиск в SQL Server 2008 R2
- 18. Найти любую букву в строке SQL Server 2008 R2
- 19. Как найти специальные символы в SQL Server 2008 R2?
- 20. Не удалось найти вариант хранения в SQL Server 2008 R2
- 21. Найти диалоговое окно, скрытое в SQL Server 2008 R2
- 22. Производительность SQL Server 2008 R2 Express DataReader
- 23. SQL Server 2008 R2 Express отказывается сохранять записи
- 24. SQL server 2008 r2 Как работает TOP?
- 25. Размер базы данных SQL Server 2008 R2
- 26. Hashtable в SQL Server 2008 R2
- 27. Вставить в Microsoft SQL Server 2008 R2
- 28. Query Xml в SQL Server 2008 R2
- 29. Массовая проверка в SQL Server 2008 r2
- 30. Уровень изоляции в SQL Server 2008 R2
Можете ли вы описать, почему эти желтые строки должны быть выбраны, а не другие? – jarlh
Выберите * из таблицы, где color = 'yellow' – Luc
это записи пробивки RFID, тип карты 1 - это пусковой удар, а тип 2 - это остановка, поэтому я хочу один старт и данные о следующей остановке. –