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_?这可以工作,但永远挂在我的生产服务器上,可能有太多数据?这可以工作,但挂起它永远在我的生产服务器上,可能数据太多了?