Member 14800672 Ответов: 3

Как получить последнюю созданную запись для каждого идентификатора в таблице?


у меня есть 3 записи

Id Name  status      Datetime
1  x      not valid  2020-6-5
2  y      valid      2020-3-1
1  x      valid      2020-6-6


Что я уже пробовал:

i want to retrieve the latest created record for each Id

я имею в виду, что результат должен быть

2  y     valid
1  x     valid


ведь 1 х действительна была создана после 1-х не действует

Maciej Los

Какой движок базы данных: MS SQL SErver, MS Access, MySql, PostgreSql, Oracle, другие?

3 Ответов

Рейтинг:
2

ishan_shah

Мы можем получить последнюю созданную запись для каждого идентификатора из таблицы, используя следующие запросы :

Выбор максимальной даты и времени и получение идентификатора в порядке убывания, если идентификатор является автоматическим приращением :

SELECT * 
FROM table
WHERE Id IN (SELECT Id FROM table WHERE Datetime = (SELECT MAX(Datetime) FROM table))
ORDER BY Id DESC
LIMIT 1


CHill60

Это приведет только к извлечению записей, где дата-время для идентификатора совпадает с максимальным временем-временем, используемым во всей таблице. Он также вернет только одну запись. ОП четко заявил: "Я хочу получить последнюю созданную запись для каждого идентификатора"
Кроме того, является ли идентификатор автоматическим приращением или нет, совершенно не имеет значения

Рейтинг:
0

Garth J Lancaster

Да ладно - ты даже не пытался писать SQL, ты заставляешь нас делать за тебя домашнее задание или что-то еще....

Так что же произойдет, если вы напишете

SELECT * from table;


ну, ясно, что он получает все, а не то, что вы просили, не так ли ? .- так как насчет того, чтобы ...

SELECT * from table where status != 'not valid';


Ну, это немного ближе , но вы еще не дошли до конца, вам все еще нужно подумать о "последней" созданной записи - как вы собираетесь с этим справиться - собираетесь ли вы тестировать или смотреть на поле Datetime ??

Почему бы вам не попробовать и не улучшить свой вопрос тем, что у вас есть, когда вы действительно что - то попробовали и застряли-мы не делаем домашнюю работу для людей


Рейтинг:
0

User-12551084

вы можете вы

ROW_NUMBER()  
функция.

declare  @tbl table
(
	Id int,
	Name nvarchar(50),
	[STATUS] nvarchar(50),
	[DateTime] date
)

INSERT INTO @tbl(Id,Name,[STATUS],[DateTime])
VALUES
(1,  'x',     'not valid',  '2020-6-5'),
(2,  'y',     'valid',      '2020-3-1'),
(1,  'x',    'valid',      '2020-6-6')


declare  @tbl2 table
(
	Id int,
	Name nvarchar(50),
	[STATUS] nvarchar(50),
	[DateTime] date,
	RowNumber int
)

INSERT INTO @tbl2(Id,Name,[STATUS],[DateTime],RowNumber)
SELECT *,ROW_NUMBER()   over( partition by  Id order by [DateTime] desc) AS RowNumber  FROM @tbl


SELECT * FROM @tbl2 WHERE [@tbl2].RowNumber=1


выход :
Id	Name	STATUS	DateTime	RowNumber
1	x	valid	2020-06-06	1
2	y	valid	2020-03-01	1


CHill60

Не знаю, почему это было понижено с 1. Я могу только предположить, что это потому, что вы эффективно выполнили домашнее задание для этих членов - это действительно никому не помогает.
Я бы лично использовал CTE вместо другой табличной переменной, но это всего лишь мое личное предпочтение, и я не думаю, что downvote был заслужен, так что мой upvote