2015-11-14 7 views
0

Пожалуйста, найдите ниже изображение, чтобы понять мои проблемы. У меня есть таблица, как показано ниже. Мне нужно получить только выделенные (желтые) записи. Каков наилучший способ найти эти записи?Найти записи в SQL Server 2008 R2

enter image description here

+2

Можете ли вы описать, почему эти желтые строки должны быть выбраны, а не другие? – jarlh

+4

Выберите * из таблицы, где color = 'yellow' – Luc

+0

это записи пробивки RFID, тип карты 1 - это пусковой удар, а тип 2 - это остановка, поэтому я хочу один старт и данные о следующей остановке. –

ответ

-1

вот код, который вы можете запустить в SQL сервере

select * from Table_name where id in (1,2,6,7,195,160,164,165) 
+0

:) Я хочу узнать на основе типа карты и последовательности записей. –

+2

Возможно, вы могли бы написать ответ, который работает даже для общих данных, т. Е. Без указания этих значений id ...? – jarlh

1

В 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 колонке. Однако это кажется небезопасным, поскольку в этих значениях столбцов могут быть пробелы.

+2

O.O, что сложный запрос: D –

0

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 и он может просто использовать идентификатор.

Смежные вопросы