2013-10-25 2 views
1

Имея немного проблем с SQL-запросом, который я пытаюсь создать. Формат таблицы выглядит следующим образом,Внутреннее соединение SQL, использующее несколько операторов в одной таблице

ID | Data Identifier | Date Added | Data Column 
1 |   1001 |  15400 | Newest Value 
1 |   1001 |  15000 | Oldest Value 
1 |   1001 |  15200 | Older Value 
1 |   1002 |  16000 | Newest Value 
2 |   1001 |  16000 | Newest Value 

То, что я пытаюсь сделать это, для каждого идентификатора в списке (1,2), и для каждого идентификатора Identifier данных в (1001,1002) возвращение только строк с первого согласования поля идентификатора и даты ближайшего и ниже 16001.

Таким образом, результаты будут:

1 | 1001 | 15400 | Newest Value 
1 | 1002 | 16000 | Newest Value 
2 | 1001 | 16000 | Newest Value 

Я попробовал несколько манерой объединений, но я постоянно возвращался повторяющиеся записи. Любые советы или помощь будут оценены.

+0

Не могли бы вы отформатировать таблицу без элементов HTML? Просто удалите элементы HTML, оставьте только текст, выберите текст, который хотите отобразить в виде таблицы, а затем нажмите кнопку «фигурные скобки». А затем просто используйте 'space bar' для настройки форматирования. –

+0

Действительно ли это должно быть «ближайшее» 15500 или оно должно быть самым большим/последним значением для DateAdded? – hallie

+0

Является ли ваш столбец «Дата добавления» типичным? –

ответ

2

Кажется, что вы хотите GROUP BY и, возможно, присоединиться к столу.

У меня есть следующий код для вас:

-- Preparing a test table 
INSERT INTO #tmpTable(ID, Identifier, DateAdded, DataColumn) 
SELECT 1, 1001, 15400, 'Newest Value' 
UNION 
SELECT 1, 1001, 15000, 'Oldest Value' 
UNION 
SELECT 1, 1001, 15200, 'Older Value' 
UNION 
SELECT 1, 1002, 16000, 'Newest Value' 
UNION 
SELECT 2, 1001, 16000, 'Newest Value' 

-- Actual Select 
SELECT b.ID, b.Identifier, b.DateAdded, DataColumn 
FROM 
    (SELECT ID, Identifier, MAX(DateAdded) AS DateAdded 
    FROM #tmpTable 
    WHERE DateAdded < 16001 
    GROUP BY ID, Identifier) a 
INNER JOIN #tmpTable b ON a.DateAdded = b.DateAdded 
AND a.ID = b.ID 
AND a.Identifier = b.Identifier 
+0

Это прекрасно работает, спасибо большое. –

+0

Anytime :) Рад помочь – Schalk

2

Вы должны создать столбец первичного ключа на вашем столе, который не будет использоваться в качестве заполнителя. Затем вы можете создать CTE, чтобы выбрать нужные строки, а затем использовать их для выбора данных.

Совокупное функция MIN(ABS(15500 - DateAdded)) возвращает ближайшее значение к 15500.

WITH g AS 
(
    SELECT MAX(UniqueKey) AS UniqueKey, ID, DataIdentifier, MIN(ABS(15500 - DateAdded)) AS "DateTest" 
    FROM test 
    GROUP BY ID, DataIdentifier 
) 
SELECT test.ID, test.DataIdentifier, test.DateAdded, test.DataColumn 
FROM g 
INNER JOIN test 
    ON g.UniqueKey = test.UniqueKey 

EDIT:

Скриншот рабочего примера:

enter image description here

+0

Привет, Крис, извините, я должен был упомянуть, что у меня нет контроля над структурой таблицы, поэтому добавление нового ключа не было вариантом. Я пошел с Шальксом, чтобы ответить выше, отвечая на вопрос. Спасибо за помощь. –

0

Я думаю, что в этом случае самосоединение было бы лучшим, но я до сих пор не получаю и ниже значения ... (может быть 15400)

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