2016-07-28 4 views
0

У меня есть база данных элементов, в которой хранится каждый доступный набор заданного элемента в отдельной строке. Просто идти по именам элементов, запись базы данных выглядит следующим образом:Попытка вернуть только один тип каждого элемента из базы данных

10316-00-B 
10316-00-M 
10316-02-B 
10316-03-B 
10316-04-B 
10316-23-B 
10316-88-B 

... где «10316» является фактическим элементом, а затем всем после того, что представляет собой определенный тип сорта. Я хотел бы написать запрос, который будет возвращать только одну запись для элемента «10316» (или в зависимости от того), а также информацию, связанную с этим элементом во всех остальных столбцах таблицы, и игнорировать остальные. Поэтому я бы получил запись для элемента «10316-00-B», но ни один из остальных. Этот процесс будет повторяться для всех других элементов, возвращаемых моим запросом.

Я не придирчивый относительно того, какой элемент данной группы возвращается; верхний будет делать. Я просто вижу один список для элементов 10316, 10317, 10318 и далее, вместо каждого элемента и варианта.

Я пробовал DISTINCT влево (columnName, 5), но это не фильтрует записи, как мне нужно. Кто-нибудь знает как это сделать? Я использую Sql Server 2008 R2.

UPDATE: Я пытаюсь реализовать решение, предоставленное @ mo2 - похоже, что это, скорее всего, вернет все данные для данного элемента, что я и хочу. К сожалению, я получаю сообщение об ошибке «Имя столбца не было указано для столбца 1« t », и я не уверен, как исправить это. Моя версия его запроса выглядит следующим образом:

SELECT * FROM (
    select left(item, 5), col1, col2, ... , row_number() 
    over (partition by LEFT(item, 5) order by item) rn 
    from Table  
) t 
where rn = 1 

FINAL UPDATE: Я пометил ответ от @kbball как решение, но на самом деле кредит должен пойти @ mo2, а также. Ответ от @kbball помог мне понять ответ от @ mo2.

ответ

0

Это один немного проще:

SELECT DISTINCT sub.item 
FROM (SELECT LEFT(columnName,5) AS item FROM Table) sub 
0

Вы хотите иметь определенный тип сорта как отдельное поле для каждого элемента, так же, как общий метод проектирования баз данных:

10316 | 00 | B

Тогда вы можете запросить с помощью:

SELECT DISTINCT(item) 
FROM itemlist 
WHERE itemnum=10316; 

Надеется, что это помогает

1

Distinct будет работать, если вы ищете только для одного столбца в одиночку. Но когда вы добавляете оставшиеся столбцы, вам нужно, оно отбрасывается. Вы можете попробовать это:

select * from (
    select 
    left(col1, 5) col1, 
    col2, 
    col3, 
    col4, 
    row_number() over (partition by left(col1, 5) order by col1) rn 
    from your_table 
) t 
where rn = 1 

вы можете изменить order by в другую колонку, такие как колонка даты/время, если вы хотите, чтобы получить первую или последнюю запись для каждого элемента.

+0

Пытаюсь свое решение, но я не уверен, что это «т», как предполагается, после закрывающей скобки. Я получаю сообщение об ошибке «Имя столбца не указано для столбца 1« t ».» – bmurrell30

+0

«t» - это просто псевдоним для подзапроса, который, как мне кажется, необходим серверу sql. Вы можете просто запустить подзапрос, чтобы понять, как он работает. Не знаете, почему вы получаете ошибку, не видя запроса. – mo2

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