SQL select max (дата) и соответствующее значение. Max дата sql
date - SQL - где дата = максимальная дата
Вот мой прием. С комплексными запросами всегда есть несколько решений...
Во-первых, получите последнюю дату для каждого идентификатора аккаунта
select AccountID, max(Date) from Update2 group by AccountIDВставьте это в подзапрос, присоединитесь к таблице, чтобы получить только самую последнюю запись
select CInner.*, CMax.MaxDate from Update2 CInner inner join (-- Max date for every AccountID select AccountID, max(Date) MaxDate from Update2 group by AccountID) CMax on CMax.AccountID = CInner.AccountID and CMax.MaxDate = CInner.DateВставьте это обратно в исходный запрос. Сделал все подзапрос, чтобы поддерживать полную внешнюю связь (я также перемещал внутренние соединения вместе для понимания)
SELECT DISTINCT A.ID , C.Date FROM IDTable A INNER JOIN AccountTable B ON B.AccountID = A.AccountID INNER JOIN UserTable UT ON UT.UserMnemonicID = A.AssignedTo FULL OUTER JOIN Updates U ON U.ID = A.ID FULL OUTER JOIN (-- Update2, with latest date select CInner.*, CMax.MaxDate from Update2 CInner inner join (-- Max date for every AccountID select AccountID, max(Date) MaxDate from Update2 group by AccountID) CMax on CMax.AccountID = CInner.AccountID and CMax.MaxDate = CInner.Date) C ON C.AccountID = B.AccountID WHERE A.StatusID NOT IN ('Complete','Open') --Need help here to only return MAX date value: AND C.Date=(SELECT MAX(C.Date) FROM Update2) ORDER BY A.IDУпомянем, что запросы с полным внешним соединением очень трудно получить. Тот факт, что у вас есть два в вашем запросе, делает мои глаза водяными, и moreso, поскольку они "отходят" от ваших основных запросов внутреннего соединения. Вы определенно, что они должны быть там?
qaru.site
SELECT MAX (Дата), включающая пару таблиц Безопасный SQL
У меня есть небольшая база данных MS Access, содержащая четыре таблицы и изо всех сил пытающаяся выполнить запрос MAX (Date), который включает в себя все таблицы. Любая помощь будет оценена.
Обзор базы данных:
TABLE COLUMNS Person Person_ID |.... Games Game_ID | Name |.... Played_Games Played_Games_ID | Game_ID | Date |.... Participation Played_Games_ID | Person_ID |...Чтобы перечислить все игры и какую дату каждый из них в последний раз играл любой человек, я использую:
SELECT DISTINCT Games.Name, (SELECT MAX(Date) FROM Played_Games WHERE Played_Games.Game_ID = Games.Game_ID) AS Date_Last_Played FROM Games ORDER BY Games.NameЭто отлично работает, но я также хотел бы перечислить, на какую дату каждый из них в последний раз играл члены определенной группы лиц. Любая помощь с этим будет принята с благодарностью.
Несколько дней назад я задал несколько схожий вопрос , но тогда моя цель состояла в том, чтобы перечислить все игры, сколько раз каждая игра воспроизводится в целом и сколько раз в каждой игре играют члены определенной группы лиц (Персоны 1 и 2 – всего лишь пример). GarethD помог мне справиться с этим, просто по коду ниже. Я попытался изменить этот код, чтобы решить мою новую задачу, потому что я предполагаю, что большая часть этой логики / структуры может быть использована повторно, но до сих пор я не был успешным самостоятельно 🙁
Любая помощь будет оценена. Спасибо за ваше время!
Solutions Collecting From Web of "SQL: SELECT MAX (Дата), включающая пару таблиц"
Я только что добавил несколько строк к последнему ответу, который я опубликовал, чтобы показать дату последнего воспроизведения, а также дату, которую последний раз воспроизводил члены группы, рядом с количеством раз. Надеюсь, это то, что вам нужно.
sql.fliplinux.com
max - Экземпляр T-SQL из Max (Дата)
Проблема, вероятно, двоякая:
- 1) Вы вводите в заблуждение логический порядок предложений, используемых в SQL Server.
- 2) Ваш DISTINCT является виновником.
Я предлагаю вам изучить и запомнить Логический порядок SQL-предложений, чтобы вы логически понимали, как SQL Server читает ваш предписанный запрос. Для простоты, начните с классического списка, который используется во многих местах.
Уже мы видим, почему ваш запрос возвращает неверные результаты, поскольку SQL Server не разбивает столбец, а разбивает разные строки по столбцам.
Список примеров:
ID Image DateMod Type 1 0x789 01-02-2014 B 1 0x791 11-12-2015 B <-- this is a tgt record 2 0x675 12-01-2015 A 5 0x324 06-26-2015 B <-- this is a tgt recordИмеет уникальные строки и, следовательно, возвращает все записи. Очевидно, что проблема DISTINCT.
Одним из решений является сохранение вашего предиката одинаковым и использование предложения GROUP BY для разбивки наборов столбцов и использования функции агрегации MAX() для возврата наибольшего значения.
;WITH C AS ( SELECT ID , MAX(DateMod) AS DateModified , CONVERT(VARCHAR(10), GETDATE(), 110) AS [Current_Time] FROM #Images WHERE Type = 'B' GROUP BY ID, Type) SELECT C.ID, B.Image, C.DateModified, C.[Current_Time] FROM C LEFT OUTER JOIN (SELECT ID, DateMod, Image FROM #Images) B ON C.ID = B.ID AND C.DateModified = B.DateModqaru.site
MySQL выбирает MAX (datetime), не возвращая максимальное значение Безопасный SQL
Пример таблицы:
id computer app version build date ---|---------|------|------------|-------|--------- 1 | aaaa1 | app1 | 1.0.0 | 1 | 2013-11-11 09:51:07 2 | aaaa1 | app2 | 2.0.0 | 2 | 2013-11-12 09:51:07 5 | xxxx2 | app1 | 1.0.0 | 1 | 2013-11-13 09:51:07 3 | cccc3 | app2 | 3.1.0 | 1 | 2013-11-14 09:51:07 4 | xxxx2 | app1 | 1.0.0 | 2 | 2013-11-15 09:51:07 5 | cccc3 | app2 | 3.1.1 | 3 | 2013-11-16 09:51:07 6 | xxxx2 | app1 | 1.0.2 | 1 | 2013-11-17 09:51:07 7 | aaaa1 | app1 | 1.0.2 | 3 | 2013-11-18 09:51:07Желаемый результат (не точный формат или порядок листинга), получение последней установки для каждого приложения на каждом компьютере:
7. aaaa1 - app1 - 1.0.2 - 3 - 2013-11-18 09:51:07 2. aaaa1 - app2 - 2.0.0 - 2 - 2013-11-12 09:51:07 6. xxxx2 - app1 - 1.0.2 - 1 - 2013-11-17 09:51:07 5. cccc3 - app2 - 3.1.1 - 3 - 2013-11-16 09:51:07Это дает мне:
1. aaaa1 - app1 - 1.0.0 - 1 - 2013-11-11 09:51:07и не
7. aaaa1 - app1 - 1.0.2 - 3 - 2013-11-18 09:51:07как я и предполагал.
MAX (дата) работает, если я ТОЛЬКО выбираю MAX (дата) и ничего больше. Но тогда я не получаю никаких данных для работы (только последняя дата).
SELECT MAX(date) AS installedЯ не ниндзя SQL, поэтому я скоро погублю, почесывая голову из-за этого.
Solutions Collecting From Web of "MySQL выбирает MAX (datetime), не возвращая максимальное значение"
Попробуйте вот так:
SELECT d.id, d.computer, d.app, d.version, d.build, a.installed FROM data d INNER JOIN ( SELECT computer, app, max(DATE) AS installed FROM data GROUP BY computer, app ) a ON a.computer = d.computer AND a.app = d.app WHERE placement = 'xxx'Внутренний запрос получает максимальную (дату) для каждой пары компьютеров и приложений, затем вы просто присоединяетесь к этому, чтобы получить остальную информацию.
Попробуйте лить поле Datetime
SELECT id, computer, app, version, build, MAX(cast(date as Datetime)) AS installed FROM data WHERE placement = 'xxx' GROUP BY app, computer, id, version, build ;max – является агрегатной функцией, которая пытается добавить все столбцы из оператора select в GROUP BY :
GROUP BY app, computer, id, version, build.Возможно, это потому, что вы храните дату как String, а сравнение строки действует иначе, чем сравнение целого числа. Вы должны сохранить дату в формате Unix Timestamp , и их будет намного проще сравнивать. Но вам потребуется дополнительное усилие, которое будет отображаться как обычная английская дата.
Что случилось с:
SELECT id, computer, app, version, build, `date` AS installed FROM data WHERE placement = 'xxx' ORDER BY installed DESC GROUP BY app;sql.fliplinux.com
sql - SQL WHERE MAX (дата) в группе GROUP BY
вероятно, вы ищете такой запрос:
SELECT e.*, CASE WHEN actual = StartDate THEN 1 ELSE 0 END AS actual_e, first_startdate FROM Employees AS e INNER JOIN(SELECT PESEL, MIN(startdate) AS first_startdate , MAX(startdate) AS actual FROM Employees AS e GROUP BY PESEL) AS g ON g.PESEL = e.PESELРЕДАКТИРОВАТЬ: в Fidde вы пишете MySQL-запрос, для SQL-сервера (тега) это намного проще:
SELECT e.* , LEAD(Employee_ID) OVER (PARTITION BY PESEL ORDER BY startdate) actual_Employee_ID , MIN(startdate) OVER (PARTITION BY PESEL) first_startdate FROM Employees AS eEDIT (результат с последним ti): для всех данных:
SELECT e.* , first_startdate , last_t_startdate , last_startdate , (SELECT max(employee_ID) FROM dbo.Employees t WHERE startdate = last_t_startdate AND PESEL = e.PESEL) AS last_t_id , (SELECT max(employee_ID) FROM dbo.Employees t WHERE startdate = last_startdate AND PESEL = e.PESEL) AS last_id FROM dbo.Employees AS e OUTER APPLY ( SELECT Min(startdate) AS first_startdate , Max(Case When employee_ID LIKE 'ti%' Then startdate End) last_t_startdate , Max(startdate) AS last_startdate FROM dbo.Employees WHERE PESEL = e.PESEL --GROUP BY PESEL ) AS gдля сгруппированных данных:
SELECT pesel , first_startdate , last_t_startdate , last_startdate , (SELECT max(employee_ID) FROM dbo.Employees t WHERE startdate = last_t_startdate AND PESEL = g.PESEL) last_t_id , (SELECT max(employee_ID) FROM dbo.Employees t WHERE startdate = last_startdate AND PESEL = g.PESEL) last_id FROM ( SELECT PESEL , Min(startdate) AS first_startdate , Max(Case When employee_ID LIKE 'ti%' Then startdate End) AS last_t_startdate , Max(startdate) AS last_startdate FROM dbo.Employees GROUP BY PESEL) AS gqaru.site
SQL select max (дата) и соответствующее значение MS SQL Server
Который работает и возвращает правильные данные большую часть времени, но я заметил проблему. Поле Notes, которое возвращается, не обязательно соответствует записи, из которой выполняется max (completedDate). Вместо этого это будет самая длинная строка? Или тот, который имеет самое высокое значение ASCII? Что делает SQL Server в случае связи между двумя записями? Я даже не уверен. Я хочу получить поле примечаний из записи max (completedDate). Как мне это сделать?
Вы можете использовать подзапрос. Подзапрос получит Max(CompletedDate) . Затем вы берете это значение и снова присоединяетесь к своей таблице, чтобы получить связь с записью с этой датой:
select ET1.TrainingID, ET1.CompletedDate, ET1.Notes from HR_EmployeeTrainings ET1 inner join ( select Max(CompletedDate) CompletedDate, TrainingID from HR_EmployeeTrainings --where AvantiRecID IS NULL OR AvantiRecID = @avantiRecID group by TrainingID ) ET2 on ET1.TrainingID = ET2.TrainingID and ET1.CompletedDate = ET2.CompletedDate where ET1.AvantiRecID IS NULL OR ET1.AvantiRecID = @avantiRecIDАх да, так оно и есть в SQL. Вы получаете Макс каждого столбца отдельно. Кажется, что вы хотите вернуть значения из строки с максимальной датой, поэтому вам нужно выбрать строку с максимальной датой. Я предпочитаю делать это с помощью подзапроса, так как запросы сохраняют компактность легко читаемой.
SELECT TrainingID, CompletedDate, Notes FROM HR_EmployeeTrainings ET WHERE (ET.AvantiRecID IS NULL OR ET.AvantiRecID = @avantiRecID) AND CompletedDate in (Select Max(CompletedDate) from HR_EmployeeTrainings B where B.TrainingID = ET.TrainingID)Если вы также хотите сопоставить AntiRecID, вы должны включить это также в подзапрос.
Каждая функция MAX оценивается индивидуально. Таким образом, MAX (CompletedDate) вернет значение последнего столбца CompletedDate, а MAX (Notes) вернет максимальное значение (то есть самое высокое по алфавиту).
Вам нужно структурировать свой запрос по-разному, чтобы получить то, что вы хотите. Этот вопрос уже задавался и несколько раз отвечал, поэтому я не буду повторять его:
Как найти запись в таблице, которая содержит максимальное значение?
Поиск записи с максимальным значением в SQL
Нет простого способа сделать это, но что-то вроде этого будет работать:
SELECT ET.TrainingID, ET.CompletedDate, ET.Notes FROM HR_EmployeeTrainings ET inner join ( select TrainingID, Max(CompletedDate) as CompletedDate FROM HR_EmployeeTrainings WHERE (ET.AvantiRecID IS NULL OR ET.AvantiRecID = @avantiRecID) GROUP BY AvantiRecID, TrainingID ) ET2 on ET.TrainingID = ET2.TrainingID and ET.CompletedDate = ET2.CompletedDatesqlserver.bilee.com
sql - SQL Выберите строки с датой max и min
Из чтения комментариев и для каждой машины, выполняющей свой собственный INSERT, вставка не будет вставлять значение для столбца автоматического увеличения, как это обрабатывается движком. Таким образом, если машина не меняет дату/время, существует прямая корреляция с идентификатором автоматического инкремента с датой/временем на основе PER MACHINE. Итак, это так, и образец, который я создал, который получает минимальный и максимальный идентификатор на MACHINE, где назначена дата/время, приведет к окончательному первому и последнему идентификатору для рассматриваемого диапазона. Затем вы можете получить конкретные идентификационные записи.
Итак, если у вас есть 3 машины, и они делают вставку в одно и то же время, их соответствующие идентификаторы будут генерироваться по-разному...
|id |date |MachineId | -----+-------+-------+----------------- |1 |2011-10-25 09:03:17.000| A |2 |2011-10-25 09:03:17.000| B |3 |2011-10-25 09:03:17.000| C |4 |2011-10-26 12:45:43.000| B |5 |2011-10-26 12:45:43.000| A |6 |2011-10-26 12:45:43.000| C ... |124 |2011-10-29 13:29:04.000| C |125 |2011-10-29 13:29:04.000| A |126 |2011-10-29 13:29:04.000| B |127 |2011-10-31 21:18:35.000| C |128 |2011-10-31 21:18:35.000| B |129 |2011-10-31 21:18:35.000| A The first and last IDs per respective machine would become Machine First ID Last ID A 1 129 B 2 128 C 3 127Внутренний предварительный запрос выполняется один раз (PER THE SPECIFIC MACHINE), поэтому вы получаете идентификатор, связанный с первым/последним экземпляром, на машинный день/период времени. Затем присоедините это обратно к таблице для фактических данных с OR в совпадении ID.
select D2.* FROM ( SELECT min( D1.ID ) MinDateID, max( D1.ID ) MaxDateID from dbo.myDatabase D1 where D1.MachineId = '7B788EE88E-6527-4CB4-AA4D-01B7F4048559' AND D1.Date >=dateadd(day,datediff(day,0,GetDate())- 7,0) ) PreQuery JOIN dbo.MyDatabase D2 on PreQuery.MinDateID = D2.ID OR PreQuery.MaxDateID = D2.IDqaru.site