Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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_Group By - Fatal编程技术网

SQL按排序结果分组

SQL按排序结果分组,sql,group-by,Sql,Group By,我的桌子看起来像这样: ---------------------------------------------------------- | ID | League | Reference | Created_at | Value | ---------------------------------------------------------- | 1 | Test | Exa | 2018-08-05 11:52:30 | 12.00 | --

我的桌子看起来像这样:

----------------------------------------------------------
| ID | League | Reference | Created_at           | Value |
----------------------------------------------------------
| 1  | Test   | Exa       | 2018-08-05 11:52:30  | 12.00 |
----------------------------------------------------------
| 2  | Test   | Alch      | 2018-08-05 12:52:30  | 9.12  |
----------------------------------------------------------
| 3  | Test   | Chrom     | 2018-08-05 12:50:30  | 6.00  |
----------------------------------------------------------
| 4  | Test   | Chrom     | 2018-08-05 10:50:30  | 2.00  |
----------------------------------------------------------
每5分钟,我在表上保存一个参考值

我想检索每个引用的值(最新的引用值由DESC创建的
排序)。目前在我的代码中,我只需循环一个引用数组
[exa,alch,…]
,并执行以下查询(针对每个联盟):

基本上,我对每个联盟的每个引用执行该查询,导致执行大量查询,并导致服务器上的高响应时间

预期结果应为,从X league收集每个参考值,但仅收集最新插入值(
在DESC创建的值)
,每个参考类型(exa、alch,…)将在
创建不同的
值(可能等于或不等于其他参考类型)

我尝试使用
groupby
,但没有成功,因为我只会得到表中的第一个结果(旧的结果):

SELECT created_at, league, value, reference
FROM currency
WHERE league = ? AND reference IN ('exa', 'alch', ...)
GROUP BY created_at DESC
我认为这种分组方法会更快,因为它对每个联赛都有一个查询,但我总是得到较旧的结果,而不是最近创建的结果…

使用过滤:

select c.*
from currency c
where c.created_at = (select max(c2.created_at)
                      from currency c2
                      where c2.league = c.league
                     );
使用筛选:

select c.*
from currency c
where c.created_at = (select max(c2.created_at)
                      from currency c2
                      where c2.league = c.league
                     );

有一个子查询,返回每个联盟的最大创建值。
JOIN
,结果如下:

select c1.*
from currency c1
join (select league, max(created_at) max_created_at
      from currency
      group by league) c2
  on  c1.league = c2.league
  and c1.created_at = c2.max_created_at

有一个子查询,返回每个联盟的最大创建值。
JOIN
,结果如下:

select c1.*
from currency c1
join (select league, max(created_at) max_created_at
      from currency
      group by league) c2
  on  c1.league = c2.league
  and c1.created_at = c2.max_created_at

您可以将
子查询
限制
子句一起使用:

select c.*
from currency c
where id = (select c1.id
            from currency c1
            where c1.league = c.league and
                  c1.Reference = c.Reference -- might be you need this also
            order by c1.created_at desc
            limit 1
           );

您可以将
子查询
限制
子句一起使用:

select c.*
from currency c
where id = (select c1.id
            from currency c1
            where c1.league = c.league and
                  c1.Reference = c.Reference -- might be you need this also
            order by c1.created_at desc
            limit 1
           );

请尝试以下查询-:

with cte as
(
select created_at, league, value, reference,ROW_NUMBER() over (partition by league,reference  order by   Created_at desc) rn 
from currency
)select * from cte where rn=1

SQL Server

尝试以下查询-:

with cte as
(
select created_at, league, value, reference,ROW_NUMBER() over (partition by league,reference  order by   Created_at desc) rn 
from currency
)select * from cte where rn=1

SQL Server

此查询似乎效率更高,您可以在此处进行检查:

如果在生产中仍然存在问题,请查看您的索引

SELECT
  currency.ID,
  currency.League,
  currency.Reference,
  currency.Created_at,
  currency.Value
 FROM
   currency
JOIN (  
SELECT
  League,
  Reference,
  MAX(Created_at) AS Created_at
 FROM
   currency
 GROUP BY
   League,
   Reference
 ) AS a
 ON
   currency.League = a.League
   AND currency.Reference = a.Reference
   AND currency.Created_at = a.Created_at

此查询似乎更有效,您可以在此处检查小提琴:

如果在生产中仍然存在问题,请查看您的索引

SELECT
  currency.ID,
  currency.League,
  currency.Reference,
  currency.Created_at,
  currency.Value
 FROM
   currency
JOIN (  
SELECT
  League,
  Reference,
  MAX(Created_at) AS Created_at
 FROM
   currency
 GROUP BY
   League,
   Reference
 ) AS a
 ON
   currency.League = a.League
   AND currency.Reference = a.Reference
   AND currency.Created_at = a.Created_at

第二个查询无效,应该会引发一个错误。您使用的是哪一个dbms?@jarlh它只是一个占位符来显示我的想法第二个查询无效,应该会引发一个错误。您使用的是哪一个dbms?@jarlh它只是一个占位符来显示我的想法并不会返回所有引用值,我认为这是因为每个引用e可以在
最大值处创建一个不同的
吗?您可以添加一些更多的样本表数据,以及预期的结果吗?我更新了主要帖子,基本上我想收集最后一个(创建于)每个引用的值不会返回所有引用值,我认为因为每个引用都可以在
max值处创建不同的
u?您可以添加更多的示例表数据以及预期结果吗?我更新了主要帖子,基本上我想收集最后一个(创建时)每个引用的值不返回所有引用值,我认为是因为每个引用可以在最大值处有一个不同的created_?不返回所有引用值,我认为是因为每个引用可以在最大值处有一个不同的created_?这可以工作,但永远挂在我的生产服务器上,可能有太多数据?这可以工作,但挂起它永远在我的生产服务器上,可能数据太多了?