标签: greatest-n-per-group

如何选择具有最大值(日期)的行?

数据如下:

id group date
1  a     2013-01-01
1  b     2014-01-01
2  a     2012-01-01
2  b     2013-01-01
Run Code Online (Sandbox Code Playgroud)

我的数据库是mysql,对于每个id,我需要选择max(date)行,我写的SQL如下:

select id,group, max(date)
from table1
group by id;
Run Code Online (Sandbox Code Playgroud)

但效果不佳。

mysql greatest-n-per-group

5
推荐指数
1
解决办法
9万
查看次数

如何从每个类别中选择前 10 条记录

我有一个带字段的表

Hour,
PathId,
Duration,
Event,
CellId,
Channel
Run Code Online (Sandbox Code Playgroud)

我有 50 多个 CellId。每个 CellId 有四个 PathId(即 0、1、2、3)。每个 PathId 都有许多事件和持续时间。现在我想显示每个 CellId 的前 10 条记录(每个 PathId)。

样品表

样品表

样本输出

样本输出

sql-server greatest-n-per-group

5
推荐指数
1
解决办法
10万
查看次数

MAX(Version) 的子选择需要很多分钟,尽管只有 ~20K 记录

我有一个非常复杂的数据模型。如果不解释正在建模的内容,我将无法理解大多数 SQL 示例,因此我将尝试进行解释。

Mainlines -> Releases -> Overlays -> Calibrations <- Parameters

Calibrations 是 Mainline-Release-Overlay 链和 Parameters 的子节点。这是我想退货的套装。

现在,复杂性在于——为了节省空间——我们存储基本 Mainline 的校准,然后只存储在发布和覆盖级别发生更改时的差异。这会产生大约 16K 行的“基本”校准集,然后每个版本有几百个更改,每个覆盖可能只有几个更改。发生参数删除。为了跟踪这一点,校准有一个状态字段 (tinyint),它被设置为 1 以进行删除。

叠加层依次进行版本控制。因此,要获得完整的“校准”,我们需要查询校准表以获取最新版本的参数数据,直至特定的叠加版本号。参数元数据可能会改变,但名称保持不变,因此这些校准可能指的是不同版本的参数,尽管名称相同。

到目前为止,以下内容已经完美且即时地运行(有以下注意事项):

SELECT c.Parameter_ParameterID, p.Designation AS Name, c.Data, o.Version
 FROM Calibrations c, Parameters p, Overlays o, Releases r
 WHERE r.Mainline_MainlineID = 9
    AND o.Release_ReleaseID = r.ReleaseID
    AND c.Overlay_OverlayID = o.OverlayID
    AND c.Parameter_ParameterID = p.ParameterID
    AND o.Version =
        (SELECT MAX(o1.Version)
            FROM Parameters p1, Calibrations c1, Overlays o1, Releases r1
            WHERE r1.Mainline_MainlineID = 9
            AND o1.Release_ReleaseID …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2012 greatest-n-per-group query-performance

5
推荐指数
1
解决办法
882
查看次数

如何正确实现复合最大 n 过滤

是的,每组最多的问题。

给定一个releases包含以下列的表:

 id         | primary key                 | 
 volume     | double precision            |
 chapter    | double precision            |
 series     | integer-foreign-key         |
 include    | boolean                     | not null
Run Code Online (Sandbox Code Playgroud)

我想选择音量的复合最大值,然后是一组系列的章节。

现在,如果我查询 per-distinct-series,我可以按如下方式轻松完成此操作:

SELECT 
       releases.chapter AS releases_chapter,
       releases.include AS releases_include,
       releases.series AS releases_series
FROM releases
WHERE releases.series = 741
  AND releases.include = TRUE
ORDER BY releases.volume DESC NULLS LAST, releases.chapter DESC NULLS LAST LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

但是,如果我有大量series(我确实有),这很快就会遇到效率问题,我要发出 100 多个查询来生成单个页面。

喜欢滚整个事情到一个查询,在那里我可以简单地说WHERE releases.series IN (1,2,3....),但我还没有想出如何说服Postgres的,让我这样做。

天真的方法是:

SELECT releases.volume …
Run Code Online (Sandbox Code Playgroud)

postgresql performance greatest-n-per-group postgresql-performance

5
推荐指数
1
解决办法
84
查看次数

根据 Varchar 字段从每个组中选择一行

给定一个Avenger数据如下所示的表:

id  Avenger         Type    Power
1   Captain America foo      2
2   Captain America bar      3
3   Me              foo      5
4   You             foo      1
5   You             bar      7
6   Iron Man        foo      4
Run Code Online (Sandbox Code Playgroud)

我想返回一个不同的复仇者联盟结果集,尽管表中的所有其他数据都与我的处理兴趣相关。出于商业原因,我想Type在适用的情况下返回“bar”类型的记录而不是“foo”。

我可以分两步做到这一点,当然:

declare @avenger table
(
    id int,
    Avenger varchar(50),
    [Power] varchar(50),
    [Type] varchar(50)
)

insert into @avenger
select * from Avenger where Type = 'bar'

insert into @avenger
select t.ID, t.Avenger, t.Type, t.Power from Avenger as t
where t.Avenger not in (select Avenger …
Run Code Online (Sandbox Code Playgroud)

sql-server greatest-n-per-group sql-server-2014

5
推荐指数
1
解决办法
3621
查看次数

查询同一行的 Min、Max 和关联列数据

我有一个查询,其中按站点和月份返回平均值。我想知道的是按站点划分的月平均值的最小值和最大值以及(困难的部分)每个发生的月份。

这是一个例子:

SQL Fiddle 的东西在这里

CREATE TABLE events (
    esite     integer NOT NULL,
    edate     timestamp with time zone NOT NULL,
    evalue    integer NOT NULL
);

INSERT INTO events Values
    (1, '2016-01-03', 11),
    (2, '2016-01-05', 90),
    (1, '2016-01-08', 7),
    (2, '2016-01-10', 40),
    (1, '2016-01-15', 12),
    (1, '2016-01-18', 66),
    (2, '2016-01-22', 54),
    (2, '2016-02-03', 70),
    (2, '2016-02-05', 56),
    (1, '2016-02-08', 61),
    (2, '2016-02-10', 23),
    (1, '2016-02-15', 30),
    (1, '2016-02-18', 15),
    (1, '2016-02-22', 41);
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个查询,该查询返回(按站点)最小和最大月平均值evalue以及最小和最大值发生的月份。我可以通过使用下面的查询得到这个:

SQL 摆弄这个

select esite, date_trunc('month', edate) …
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate greatest-n-per-group postgresql-9.4

5
推荐指数
1
解决办法
1585
查看次数

获取汇总行的 ID

我有以下查询来获取与最新日期对应的值:

SELECT MAX(RowAddedDate), X, Y
FROM dbo.MyTable
GROUP BY X, Y
Run Code Online (Sandbox Code Playgroud)

这很好,但我需要获取此查询中每一行的 ID。如果我添加 ID,我会得到所有内容,因为 ID 需要在GROUP BY.

我该如何解决这个问题?

sql-server aggregate t-sql greatest-n-per-group

5
推荐指数
1
解决办法
5547
查看次数

如何获得 GROUP BY 的最大元素?

如您所见,我想获取每个 SKU 的最新采购订单。

样本数据

我有这个数据集,

CREATE TABLE PurchaseOrders (
        id            int  PRIMARY KEY AUTO_INCREMENT,
        sku           varchar(6),
        purchase_date date
);


INSERT INTO PurchaseOrders VALUES
    ( 1, 'ABC123', '2017-12-23' ),
    ( 2, 'ABC123', '2016-11-11' ),
    ( 3, 'DEF456', '2011-01-03' ),
    ( 4, 'DEF456', '2011-10-21' ),
    ( 5, 'GHI789', '2017-01-23' ),
    ( 6, 'GHI789', '2017-11-21' );
Run Code Online (Sandbox Code Playgroud)

想要的结果

1 | ABC123 | 2017-12-23
4 | DEF456 | 2011-10-21
6 | GHI789 | 2017-11-21
Run Code Online (Sandbox Code Playgroud)

mysql greatest-n-per-group

5
推荐指数
1
解决办法
180
查看次数

使用 ORDER BY 和 LIMIT 对每个组的 n 行求和,其中 LIMIT 是基于另一个表

我需要建立一个梦幻足球游戏用户排行榜。游戏的简化数据库如下:

  • users必须squad_playerssquads每一个matches(由相关transfer_period
  • playersmatch_points每个matches
  • squad_players位置优先。该优先级是如果换人的顺序squad_players不会出现在matches
  • squads具有formations确定从优先级排序的每个位置中选择的最大玩家数量

数据库为MySQL 5.6,最大数量users10K

我能够内部加入(按顺序)squad_players, squads, matches,match_points以获得每个squad_players玩过的人(players没有玩过的人没有match_points)的观点。

我奋力SUM的分X squad_playerssquads其中Xformations通过确定位置的的squad_players

我试图通过具有相关子查询的group by修改 …

mysql database-design group-by mysql-5.6 greatest-n-per-group

5
推荐指数
1
解决办法
800
查看次数

Postgres 可以向后扫描索引吗?

我们使用 Amazon RDS 实例

x86_64-pc-linux-gnu 上的 PostgreSQL 11.13,由 gcc (GCC) 7.3.1 20180712 (Red Hat 7.3.1-12) 编译,64 位

我有一个简单的经典每组前 1 名查询。我需要获取每个 的历史记录中的最新项目creativeScheduleId

这是表和索引的定义:

CREATE TABLE IF NOT EXISTS public.creative_schedule_status_histories (
  id serial PRIMARY KEY,
  "creativeScheduleId" text NOT NULL,
  -- other columns
);

CREATE UNIQUE INDEX IF NOT EXISTS idx_creativescheduleid_id
  ON public.creative_schedule_status_histories ("creativeScheduleId" ASC, id ASC);
Run Code Online (Sandbox Code Playgroud)

当引擎的查询排序时id ASC仅读取索引并且不执行任何额外的排序:

EXPLAIN (ANALYZE) 
SELECT history.id, history."creativeScheduleId"
FROM  (
    SELECT cssh.id, cssh."creativeScheduleId"
         , ROW_NUMBER() OVER (PARTITION BY cssh."creativeScheduleId"
                              ORDER BY cssh.id ASC) …
Run Code Online (Sandbox Code Playgroud)

postgresql index execution-plan window-functions greatest-n-per-group

5
推荐指数
1
解决办法
516
查看次数