2013-12-11 2 views
0

Привет всем Я сделал запрос, используя левые внешние соединения, которые приводят к некоторым, что, как таблице ниже:определенного значения столбца в SQL Server 2008

 
| 00-00-00-00-00 | 1 | a.txt | 
| 00-00-00-00-00 | 2 | b.txt | 
| 00-00-00-00-00 | 1 | c.txt | 
| 11-11-11-11-11 | 2 | d.txt | 

То, что я хочу, это окрености значения столбца MAC ниже - SQL Fiddle, чтобы лучше понять.

SQLFIDDLE

Благодаря

РЕДАКТИРОВАТЬ

Цель состоит в том, что 2 и 3 являются бесполезными или избыточные данные, где, как 1 и 4 являются полезными означает, что 1 и 4 показывают ток файл на ПДК

Выход:

 
| 00-00-00-00-00 | 1 | a.txt | 
| 11-11-11-11-11 | 2 | d.txt | 
+4

Но вы хотите, чтобы другие столбцы также? Если да, какое имя файла (например) вам нужно? Если вам просто нужен Macaddress, это просто «выберите отдельный MacAddress из Heartbeats». Else может делать 'select min (id), min (counterNo), min (имя_файла), MacAddress из Heartbeats группа от MacAddress'. Но это произвольный выбор для id, filename и counterNo ... –

+0

Я с @ Raphaël Althaus, и если вы хотите только отличные, то вот запрос выберите отдельный macaddress из Heartbeats –

+0

Да, я хочу другие колонки, которые я дал в Filldle является образцом, и я хочу, чтобы все остальные столбцы – Rafay

ответ

1

Если вы хотите получить только определенные macaddresses, вы можете сделать:

SELECT DISTINCT macaddress FROM heartbeats 

Если вы хотите, чтобы все столбцы наряду с отчетливым MACADDRESS, вам необходимо создать правило, чтобы получить их. Запрос ниже дает вам те, с наибольшим идентификатором для каждого MACADDRESS:

SELECT t1.* 
FROM heartbeats t1 
LEFT JOIN heartbeats t2 
    ON (t1.macaddress = t2.macaddress AND t1.id < t2.id) 
WHERE t2.id IS NULL 

sqlfiddle demo

EDIT:

Поскольку в исходном запросе код используется оленья кожа имеет идентификатор столбца выше запрос был уточнен как:

with cte as (
select ROW_NUMBER() OVER(ORDER BY (Select 0)) AS ID,* from heartBeats 
) 


SELECT t1.* 
FROM cte t1 
LEFT JOIN cte t2 
    ON (t1.macaddress = t2.macaddress AND t1.id < t2.id) 
WHERE t2.id IS NULL 

SQL Fiddle

+0

Да, это правильно, если у меня есть ID, но в исходном запросе, который я должен использовать в коде, у него нет идентификатора, могу ли я использовать номер строки? – Rafay

4

Невозможно ответить точно, что вы просите. Однако обычно люди, выражающие заданный вами вопрос, действительно хотят спросить что-то вроде «Я хочу, чтобы все столбцы для выборки строк содержали только разные значения MacAddress». Этот вопрос имеет много ответов, так как результат не является детерминированным. Простейшее решение выбрать первый (по какому-либо определению «первых») строк для каждого MACADDRESS:

with cte as (
    select row_number() over (partition by MacAddress order by CounterNo) as rn, * 
      from Heartbeats 
) 
select * from cte where rn = 1; 
+0

ваш ответ помог сделать запрос благодаря – Rafay

1
SELECT hb1.* FROM [heartbeats] as hb1 
     LEFT OUTER JOIN [heartbeats] as hb2 
     ON (hb1.macaddress = hb2.macaddress AND hb1.id > hb2.id) 
     WHERE hb2.id IS NULL; 
Смежные вопросы