select 最新记录(如果有重复)
select most recent record if theres a duplicate
所以我一直在为这个问题绞尽脑汁,主要是因为我在 2010 年访问,我在互联网上发现的大多数查询都有在访问时不起作用的命令。
id name date qty created
====================================================
1 abc 01/2016 20 06/07/2016 11:00
2 abc 02/2016 20 06/07/2016 11:00
3 abc 03/2016 20 06/07/2016 11:00
4 abc 01/2016 30 06/07/2016 13:00
我需要像这样提取一个记录集:
id name date qty created
====================================================
2 abc 02/2016 20 06/07/2016 11:00
3 abc 03/2016 20 06/07/2016 11:00
4 abc 01/2016 30 06/07/2016 13:00
创建的字段只是一个时间戳,日期字段是一个"due date"。基本上我需要为每个名称和日期提取最新的数量。 ID 是唯一的,所以我可以使用它,如果它更容易的话。
到目前为止我有:
SELECT m1.date, m1.name, m1.created
FROM table AS m1 LEFT JOIN table AS m2 ON (m1.created < m2.created) AND
(m1.date = m2.date)
WHERE m2.created IS NULL;
但是这个只给我最新的冲突数据,即。我的 example.i 中的记录 n°4 还需要其他两个记录。有什么想法吗?
尝试使用 NOT EXISTS()
:
SELECT * FROM YourTable t
WHERE NOT EXISTS(SELECT 1 FROM YourTable s
WHERE t.date = s.date and s.created > t.created
AND t.name = s.name)
我认为您还缺少一个条件,所以我添加了它:
and t.name = s.name
你没有标记你的 RDBMS,如果它 SQL-Server/Oracle/Postgresql 你可以使用 ROW_NUMBER()
:
SELECT s.date, s.name, s.created FROM (
SELECT t.*,
ROW_NUMBER() OVER(PARTITION BY t.date,t.name ORDER BY t.created DESC) as rnk
FROM YourTable t) s
WHERE s.rnk = 1
试试这个:
SELECT m1.date, m1.name, m1.qty, m1.created
FROM table AS m1
JOIN (
SELECT date, name, MAX(created) AS created
FROM table
GROUP BY date, name
) AS m2 ON m1.date = m2.date AND m1.name = m2.name AND m1.created = m2.created
所以我一直在为这个问题绞尽脑汁,主要是因为我在 2010 年访问,我在互联网上发现的大多数查询都有在访问时不起作用的命令。
id name date qty created
====================================================
1 abc 01/2016 20 06/07/2016 11:00
2 abc 02/2016 20 06/07/2016 11:00
3 abc 03/2016 20 06/07/2016 11:00
4 abc 01/2016 30 06/07/2016 13:00
我需要像这样提取一个记录集:
id name date qty created
====================================================
2 abc 02/2016 20 06/07/2016 11:00
3 abc 03/2016 20 06/07/2016 11:00
4 abc 01/2016 30 06/07/2016 13:00
创建的字段只是一个时间戳,日期字段是一个"due date"。基本上我需要为每个名称和日期提取最新的数量。 ID 是唯一的,所以我可以使用它,如果它更容易的话。 到目前为止我有:
SELECT m1.date, m1.name, m1.created
FROM table AS m1 LEFT JOIN table AS m2 ON (m1.created < m2.created) AND
(m1.date = m2.date)
WHERE m2.created IS NULL;
但是这个只给我最新的冲突数据,即。我的 example.i 中的记录 n°4 还需要其他两个记录。有什么想法吗?
尝试使用 NOT EXISTS()
:
SELECT * FROM YourTable t
WHERE NOT EXISTS(SELECT 1 FROM YourTable s
WHERE t.date = s.date and s.created > t.created
AND t.name = s.name)
我认为您还缺少一个条件,所以我添加了它:
and t.name = s.name
你没有标记你的 RDBMS,如果它 SQL-Server/Oracle/Postgresql 你可以使用 ROW_NUMBER()
:
SELECT s.date, s.name, s.created FROM (
SELECT t.*,
ROW_NUMBER() OVER(PARTITION BY t.date,t.name ORDER BY t.created DESC) as rnk
FROM YourTable t) s
WHERE s.rnk = 1
试试这个:
SELECT m1.date, m1.name, m1.qty, m1.created
FROM table AS m1
JOIN (
SELECT date, name, MAX(created) AS created
FROM table
GROUP BY date, name
) AS m2 ON m1.date = m2.date AND m1.name = m2.name AND m1.created = m2.created