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

Это насколько я могу идти. Проблема здесь в том, что все JOINs будут разрешены перед предложением WHERE, поэтому в текущей форме все эти FULL OUTER JOINs кажутся бессмысленными, так как будут включены только те результирующие строки с max (Date).

Упомянем, что запросы с полным внешним соединением очень трудно получить. Тот факт, что у вас есть два в вашем запросе, делает мои глаза водяными, и 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 помог мне справиться с этим, просто по коду ниже. Я попытался изменить этот код, чтобы решить мою новую задачу, потому что я предполагаю, что большая часть этой логики / структуры может быть использована повторно, но до сих пор я не был успешным самостоятельно 🙁

SELECT Games.Name, IIF(ISNULL(TimesPlayed),0,TimesPlayed) AS Times_Played, IIF(ISNULL(TimesPlayedByGroupMembers),0,TimesPlayedByGroupMembers) AS Times_Played_By_Group_Members FROM Games LEFT JOIN ( SELECT Game_ID, COUNT(*) AS TimesPlayed, SUM(IIF(ISNULL(Participation.Played_Games_ID),0,1)) AS TimesPlayedByGroupMembers FROM Played_Games LEFT JOIN ( SELECT Played_games_ID FROM Participation WHERE Person_ID IN (1, 2) GROUP BY Played_games_ID ) AS Participation ON Participation.Played_Games_ID = Played_Games.Played_Games_ID GROUP BY Game_ID ) AS Played_Games ON Played_Games.Game_ID = Games.Game_ID ORDER BY Games.Name

Любая помощь будет оценена. Спасибо за ваше время!

Solutions Collecting From Web of "SQL: SELECT MAX (Дата), включающая пару таблиц"

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

SELECT Games.Name, IIF(ISNULL(TimesPlayed),0,TimesPlayed) AS Times_Played, IIF(ISNULL(TimesPlayedByGroupMembers),0,TimesPlayedByGroupMembers) AS Times_Played_By_Group_Members, LastPlayed, LastPlayedByGroupMembers FROM Games LEFT JOIN ( SELECT Game_ID, COUNT(*) AS TimesPlayed, SUM(IIF(ISNULL(Participation.Played_Games_ID),0,1)) AS TimesPlayedByGroupMembers, MAX(Played_Games.[Date]) AS LastPlayed, MAX(IIF(ISNULL(Participation.Played_Games_ID),NULL,Played_Games.[Date])) AS LastPlayedByGroupMembers FROM Played_Games LEFT JOIN ( SELECT Played_games_ID FROM Participation WHERE Person_ID IN (1, 2) GROUP BY Played_games_ID ) AS Participation ON Participation.Played_Games_ID = Played_Games.Played_Games_ID GROUP BY Game_ID ) AS Played_Games ON Played_Games.Game_ID = Games.Game_ID ORDER BY Games.Name

sql.fliplinux.com

max - Экземпляр T-SQL из Max (Дата)

Проблема, вероятно, двоякая:

  • 1) Вы вводите в заблуждение логический порядок предложений, используемых в SQL Server.
  • 2) Ваш DISTINCT является виновником.

Я предлагаю вам изучить и запомнить Логический порядок SQL-предложений, чтобы вы логически понимали, как SQL Server читает ваш предписанный запрос. Для простоты, начните с классического списка, который используется во многих местах.

Classic Complete FROM | FROM WHERE | ON GROUP BY | JOIN HAVING | WHERE SELECT | GROUP BY ORDER BY | WITH CUBE, WITH ROLLUP | HAVING | SELECT | DISTINCT | ORDER BY | TOP

Уже мы видим, почему ваш запрос возвращает неверные результаты, поскольку 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.DateMod

-- Результаты

ID Image DateModified Current_Time 1 0x3078373931 11-12-2015 07-16-2016 5 0x3078333234 06-26-2015 07-16-2016

qaru.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

Мой оператор SQL:

SELECT id, computer, app, version, build, MAX(date) AS installed FROM data WHERE placement = 'xxx' GROUP BY app, computer ;

Это дает мне:

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

РЕДАКТИРОВАТЬ: для получения фактического Employee_ID в каждом подпроцессе использования строки:

, CASE WHEN actual = StartDate THEN null ELSE (SELECT max(a.Employee_ID) FROM Employees AS a WHERE a.PESEL = e.PESEL and a.StartDate = actual) END AS actual_Employee_ID

РЕДАКТИРОВАТЬ: в 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 e

EDIT (результат с последним 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

вывод:

ID Employee_ID PESEL StartDate ExpirationDate first_startdate last_t_startdate last_startdate last_t_id last_id 1 pi39764 1111 2015-01-01 2016-06-01 2014-01-01 2014-01-01 2015-01-01 ti00001 pi39764 2 pi12986 1234 2015-12-01 2099-12-31 2015-12-01 NULL 2015-12-01 NULL pi12986 3 ti00001 1111 2014-01-01 2014-12-31 2014-01-01 2014-01-01 2015-01-01 ti00001 pi39764 4 pi12345 4321 2015-02-01 2015-06-30 2015-02-01 NULL 2016-01-01 NULL pi12345 5 pi12345 4321 2016-01-01 2099-12-31 2015-02-01 NULL 2016-01-01 NULL pi12345 6 pi12345 4321 2015-07-01 2015-12-31 2015-02-01 NULL 2016-01-01 NULL pi12345

для сгруппированных данных:

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 g

вывод:

pesel first_startdate last_t_startdate last_startdate last_t_id last_id 1111 2014-01-01 2014-01-01 2015-01-01 ti00001 pi39764 1234 2015-12-01 NULL 2015-12-01 NULL pi12986 4321 2015-02-01 NULL 2016-01-01 NULL pi12345

qaru.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.CompletedDate

sqlserver.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.ID

qaru.site