Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:如何按国家/地区选择最近的值_Sql_Date_Distinct - Fatal编程技术网

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;