SQL:如何按国家/地区选择最近的值
我有一个表,有三列:天、国家、值。有许多不同日期的国家值。例如:SQL:如何按国家/地区选择最近的值,sql,date,distinct,Sql,Date,Distinct,我有一个表,有三列:天、国家、值。有许多不同日期的国家值。例如: DAY COUNTRY VALUE 04-SEP-19 BELGIUM 2124 15-MAR-19 BELGIUM 2135 21-MAY-19 SPAIN 1825 18-JUL-19 SPAIN 1724 26-MAR-19 ITALY
DAY COUNTRY VALUE
04-SEP-19 BELGIUM 2124
15-MAR-19 BELGIUM 2135
21-MAY-19 SPAIN 1825
18-JUL-19 SPAIN 1724
26-MAR-19 ITALY 4141
DAY COUNTRY VALUE
04-SEP-19 BELGIUM 2124
18-JUL-19 SPAIN 1724
26-MAR-19 ITALY 4141
我想按国家选择最近的值。例如:
DAY COUNTRY VALUE
04-SEP-19 BELGIUM 2124
15-MAR-19 BELGIUM 2135
21-MAY-19 SPAIN 1825
18-JUL-19 SPAIN 1724
26-MAR-19 ITALY 4141
DAY COUNTRY VALUE
04-SEP-19 BELGIUM 2124
18-JUL-19 SPAIN 1724
26-MAR-19 ITALY 4141
我可以使用什么样的sql查询
谢谢您的帮助。您可以使用以下查询: 只需用表名替换
表名
SELECT
COUNTRY,
VALUE,
MAX(DATE) AS "MostRecent"
FROM TABLE_NAME
GROUP BY COUNTRY;
让我们假设day列的类型是date。 在子查询中,您可以找到(country,max date)的元组,要添加值,您可以按照注释中提到的方式加入或在中使用
SELECT DISTINCT day, country, value
FROM yourTable
WHERE (country, day)
in (
SELECT country, MAX(day) as day
FROM yourTable
GROUP BY country, value
)
我理解这个问题,因为您需要所有国家/地区的最新值,该国家/地区可以在表中重复(?):
我对它进行了测试,它运行正常。您可以使用
行号()
窗口函数(如果您的DBMS支持的话)
另一种方法是使用窗口函数(SQLServer、MySQL8等) e、 g 然后只需过滤到该函数返回1的位置 完整示例:
WITH TestData
AS ( SELECT '04-SEP-19' AS [Day], 'BELGIUM' AS [COUNTRY], 2124 AS [VALUE]
UNION
SELECT '15-MAR-19' AS [Day], 'BELGIUM' AS [COUNTRY], 2135 AS [VALUE]
UNION
SELECT '21-MAY-19' AS [Day], 'SPAIN' AS [COUNTRY], 1825 AS [VALUE]
UNION
SELECT '18-JUL-19' AS [Day], 'SPAIN' AS [COUNTRY], 1724 AS [VALUE]
UNION
SELECT '26-MAR-19' AS [Day], 'ITALY' AS [COUNTRY], 4141 AS [VALUE] ),
TestDataRanked
AS ( SELECT *,
ROW_NUMBER() OVER ( PARTITION BY COUNTRY ORDER BY CONVERT(DATE, [Day]) DESC ) AS SelectionRank
FROM TestData )
SELECT [Day],
COUNTRY,
[VALUE]
FROM TestDataRanked
WHERE SelectionRank = 1;
哪个数据库管理系统?Column Day数据类型?您可以在这里看到答案:您不能将该值保留在那里,您会得到:…在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。如果不使用聚合函数,则无需执行GROUP BY,只需执行select DISTINCT。我修改了我的答案。谢谢你的提醒。显然OP想要一个更复杂、更依赖平台的答案。。。奇怪。@Laszlo您可以在第一个查询中添加distinct
WITH TestData
AS ( SELECT '04-SEP-19' AS [Day], 'BELGIUM' AS [COUNTRY], 2124 AS [VALUE]
UNION
SELECT '15-MAR-19' AS [Day], 'BELGIUM' AS [COUNTRY], 2135 AS [VALUE]
UNION
SELECT '21-MAY-19' AS [Day], 'SPAIN' AS [COUNTRY], 1825 AS [VALUE]
UNION
SELECT '18-JUL-19' AS [Day], 'SPAIN' AS [COUNTRY], 1724 AS [VALUE]
UNION
SELECT '26-MAR-19' AS [Day], 'ITALY' AS [COUNTRY], 4141 AS [VALUE] ),
TestDataRanked
AS ( SELECT *,
ROW_NUMBER() OVER ( PARTITION BY COUNTRY ORDER BY CONVERT(DATE, [Day]) DESC ) AS SelectionRank
FROM TestData )
SELECT [Day],
COUNTRY,
[VALUE]
FROM TestDataRanked
WHERE SelectionRank = 1;