2016-11-28 3 views
1

Я пытаюсь выбрать максимальные временные записи из таблицы 1 на основе некоторых данных из таблицы 2. Я получаю правильные записи, основываясь на тех ограничениях, которые я поставил на запрос, но я все равно получаю повторяющиеся записи, а не максимальные записи с отметками времени. Любые идеи о том, что не так с запросом?Ошибка при выборе max строк по дате

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

SELECT 
MAX(timestamp) AS maxtime, Leveltype, assign_ID 
FROM  
WHERE 
(leveltype IN 
(SELECT leveltype FROM dbo.idleveltypes WHERE (id = 901413368))) 
GROUP BY timestamp, assign_ID, leveltype 
HAVING (assign_ID = '901413368') 

UPDATE: Этот вопрос был решен ответ WEI_DBA в поле ниже:

Remove the timestamp column from your Group By. Also put the assign_ID in  the Where Clause and remove the Having clause 
+1

Пример данных и желаемых результатов действительно поможет передать то, что вы хотите сделать (лучше, чем нерабочий запрос, по сути). –

+0

Можете ли вы добавить ожидаемый результат и фактический результат и версию сервера, а также – TheGameiswar

+1

Удалите столбец «timestamp» из вашей группы. Также поместите 'assign_ID' в предложение Where и удалите предложение Have. –

ответ

1

Снять отметку времени из предложения GROUP BY из-за вы получаете MAX (временная метка)

Вы не Шоуда добавить агрегированный полей в предложение GROUP BY.

SELECT   
    MAX(timestamp) AS maxtime, 
    Leveltype, 
    assign_ID 
FROM 
    dbo.q_Archive 
WHERE 
    (leveltype IN (SELECT  leveltype 
          FROM   dbo.idleveltypes 
          WHERE  (id = 901413368))) 
GROUP assign_ID, leveltype 
HAVING  (assign_ID = '901413368') 
3

Возможно, следующее, что вы хотите. Он также должен быть более простой способ, чтобы написать запрос:

SELECT MAX(a.timestamp) AS maxtime, a.Leveltype, a.assign_ID 
FROM dbo.q_Archive a JOIN 
    dbo.idleveltypes lt 
    ON a.leveltype = lt.leveltype AND 
     a.assign_ID = lt.id 
WHERE assign_ID = 901413368 
GROUP BY assign_ID, leveltype; 

Примечания:

  • Фильтр по assign_IDперед делать в group by. Это намного эффективнее.
  • A JOIN - более типичный способ представления отношений между двумя таблицами.
  • Условие JOIN должно быть на всех столбцах, необходимых для сопоставления; Кажется, что два.
  • Я не понимаю, почему таблица leveltype имела бы столбец с именем id, но это ваша структура данных.
  • GROUP BY не нужен timestamp.
  • Определите тип столбца идентификатора, который должен быть 901413368. Это число или строка? Используйте только одинарные кавычки для констант строк и дат.
Смежные вопросы