标签: greatest-n-per-group

选择按某些列排序的行和不同的列

与 - PostgreSQL DISTINCT ON有关,使用不同的ORDER BY

我有桌子购买(product_id,purchase_at,address_id)

样本数据:

| id | product_id |   purchased_at    | address_id |
| 1  |     2      | 20 Mar 2012 21:01 |     1      |
| 2  |     2      | 20 Mar 2012 21:33 |     1      |
| 3  |     2      | 20 Mar 2012 21:39 |     2      |
| 4  |     2      | 20 Mar 2012 21:48 |     2      |
Run Code Online (Sandbox Code Playgroud)

我期望的结果是每个address_id的最近购买的产品(完整行),并且结果必须由downloaded_at字段以后代顺序排序:

| id | product_id |   purchased_at    | address_id |
| 4  |     2      | …
Run Code Online (Sandbox Code Playgroud)

postgresql greatest-n-per-group distinct-on

21
推荐指数
2
解决办法
8011
查看次数

一对多查询选择每个父母的所有父母和单个顶级孩子

有两个SQL表:

Parents:
+--+---------+
|id|   text  |
+--+---------+
| 1|  Blah   |
| 2|  Blah2  |
| 3|  Blah3  |
+--+---------+

Childs
+--+------+-------+
|id|parent|feature|
+--+------+-------+
| 1|   1  |  123  |
| 2|   1  |   35  |
| 3|   2  |   15  |
+--+------+-------+
Run Code Online (Sandbox Code Playgroud)

我想从Parents表的每一行中选择单个查询,并从Childs表中选择与"parent" - "id"值和最大"feature"列值相关的每一行.在此示例中,结果应为:

+----+------+----+--------+---------+
|p.id|p.text|c.id|c.parent|c.feature|
+----+------+----+--------+---------+
|  1 | Blah |  1 |    1   |    123  |
|  2 | Blah2|  3 |    2   |    15   |
|  3 | Blah3|null|   null |   null  |
+----+------+----+--------+---------+
Run Code Online (Sandbox Code Playgroud)

其中p …

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

20
推荐指数
3
解决办法
2万
查看次数

简单查询以获取每个ID的最大值

好的,我有一个这样的表:

ID     Signal    Station    OwnerID
111     -120      Home       1
111     -130      Car        1
111     -135      Work       2
222     -98       Home       2
222     -95       Work       1
222     -103      Work       2
Run Code Online (Sandbox Code Playgroud)

这一切都在同一天.我只需要Query来返回每个ID的最大信号:

ID    Signal    Station    OwnerID
111   -120      Home        1
222   -95       Work        1
Run Code Online (Sandbox Code Playgroud)

我尝试使用MAX()和聚合混乱,每个记录的Station和OwnerID都不同.我需要加入吗?

sql sql-server max greatest-n-per-group

19
推荐指数
2
解决办法
4万
查看次数

SQL Server仅使用最新值选择不同的行

我有一个包含以下列的表

  • ID
  • ForeignKeyId
  • 为AttributeName
  • 的AttributeValue
  • 创建

部分数据可能如下所示:

1, 1, 'EmailPreference', 'Text', 1/1/2010
2, 1, 'EmailPreference', 'Html', 1/3/2010
3, 1, 'EmailPreference', 'Text', 1/10/2010
4, 2, 'EmailPreference', 'Text', 1/2/2010
5, 2, 'EmailPreference', 'Html', 1/8/2010
Run Code Online (Sandbox Code Playgroud)

我想运行一个查询,为每个不同的ForeignKeyId和AttributeName提取AttributeValue列的最新值,使用Created列确定最新值.示例输出将是:

ForeignKeyId AttributeName    AttributeValue Created
-------------------------------------------------------
1           'EmailPreference' 'Text'         1/10/2010
2           'EmailPreference' 'Html'         1/8/2010
Run Code Online (Sandbox Code Playgroud)

如何使用SQL Server 2005执行此操作?

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

18
推荐指数
2
解决办法
3万
查看次数

Postgres中的GROUP BY - JSON数据类型不相等?

我在匹配表中有以下数据:

5;{"Id":1,"Teams":[{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}],"TeamRank":[1,2]}
6;{"Id":2,"Teams":[{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}],"TeamRank":[1,2]}
Run Code Online (Sandbox Code Playgroud)

我想按名称选择表格中每个最后一个不同的团队.即我想要一个将返回的查询:

6;{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}
6;{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}
Run Code Online (Sandbox Code Playgroud)

所以每个团队从上次那个团队出现在表中.
我一直在使用以下(从这里):

WITH t AS (SELECT id, json_array_elements(match->'Teams') AS team FROM matches)
SELECT MAX(id) AS max_id, team FROM t GROUP BY team->'Name';
Run Code Online (Sandbox Code Playgroud)

但这回归:

ERROR: could not identify an equality operator for type json
SQL state: 42883
Character: 1680
Run Code Online (Sandbox Code Playgroud)

我知道Postgres 没有JSON的相等性.我只需要团队名称(字符串)的相等性,该团队中的队员不需要进行比较.

任何人都可以建议另一种方法吗?
以供参考:

SELECT id, json_array_elements(match->'Teams') AS team FROM matches
Run Code Online (Sandbox Code Playgroud)

收益:

5;"{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]}"
5;"{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}"
6;"{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]}"
6;"{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}"
Run Code Online (Sandbox Code Playgroud)

编辑:我转向text并关注这个问题,我用DISTINCT ON而不是GROUP BY.这是我的完整查询:

WITH t AS (SELECT id, …
Run Code Online (Sandbox Code Playgroud)

sql postgresql json greatest-n-per-group lateral

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

查找每个客户组的最新帐户

我有一个包含客户信息的表.为每个客户分配一个客户ID(他们的SSN),他们在打开更多帐户时保留这些ID.两个客户可能在同一个帐户中,每个客户都有自己的ID.帐号不按日期排序.

我想找到每个客户或客户群的最新帐户.如果两个客户曾经在一个帐户上,我想要返回客户所在的最新帐户.

这是一个包含一些可能情况的示例表.

示例表ACCT:

acctnumber  date            Cust1ID     Cust2ID 
10000       '2016-02-01'    1110        NULL    --Case0-customer has only ever had
                                                --one account

10001       '2016-02-01'    1111        NULL    --Case1-one customer has multiple
10050       '2017-02-01'    1111        NULL    --accounts
400050      '2017-06-01'    1111        NULL
10089       '2017-12-08'    1111        NULL

10008       '2016-02-01'    1120        NULL    --Case2-customer has account(s) and later
10038       '2016-04-01'    1120        NULL
10058       '2017-02-03'    1120        1121    --gets account(s) with another customer

10002       '2016-02-01'    1112        NULL    --Case3-customer has account(s) and later
10052       '2017-02-02'    1113        1112    --becomes the second customer on …
Run Code Online (Sandbox Code Playgroud)

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

18
推荐指数
1
解决办法
577
查看次数

如何通过ORDER构建一个SQLite查询到GROUP?

我有一个相当有趣的情况.我有一个充满地址和消息的SQLite数据库(地址不是唯一的;消息是).每条消息还有一个与之关联的日期.我想要做的是选择第一个消息的地址,消息,日期以及与该地址关联的消息数量.

所以,我想,"我可以通过集团的地址只有每个地址得到一个消息,然后按日期顺序这些,也获取地址栏的数量."

我这样做了,它有效......有点儿.它获取正确的计数,每个地址只获取一条消息,并按日期排序 - 但它不会选择该地址的最新消息.这似乎是武断的.

例如,我有三条消息(最早到最晚)来自地址Y的A,B,C和来自地址Z的三条消息D,E,F.查询可以获取消息B和E,然后按日期对它们进行排序.它应该获取消息C和F,并按日期对它们进行排序.

这是我到目前为止:

// Expanded version:
Cursor cursor = db.query(
    /* FROM */ "messages_database",
    /* SELECT */ new String[]{ "*", "COUNT(address) AS count" },
    /* WHERE */ null,
    /* WHERE args */ null,
    /* GROUP BY */ "address",
    /* HAVING */ null,
    /* ORDER BY */ "date DESC"
);

// Or, same code on one line:
Cursor cursor = db.query("messages_database", new String[]{ "*", "COUNT(address) AS count" …
Run Code Online (Sandbox Code Playgroud)

sql sqlite android greatest-n-per-group

17
推荐指数
2
解决办法
4万
查看次数

根据上次日期选择记录

根据Course下面的表格:

在此输入图像描述

如何选择具有最新日期的课程名称的记录?我的意思是如果我有一个ID的两个相同的课程名称,我应该只显示最新的一个作为下面的结果.

简单地说,我只想显示最新的每行("ID","课程名称").

在此输入图像描述

如果我在Course表中有两个日期列,即StartDate和EndDate,我想仅基于EndDate显示相同的内容.

我正在使用PostgreSQL.

sql database postgresql greatest-n-per-group

17
推荐指数
3
解决办法
3万
查看次数

针对每个N的最新记录的最佳执行查询

这是我发现自己的情景.

我有一个相当大的表,我需要查询来自的最新记录.以下是查询基本列的创建:

CREATE TABLE [dbo].[ChannelValue](
   [ID] [bigint] IDENTITY(1,1) NOT NULL,
   [UpdateRecord] [bit] NOT NULL,
   [VehicleID] [int] NOT NULL,
   [UnitID] [int] NOT NULL,
   [RecordInsert] [datetime] NOT NULL,
   [TimeStamp] [datetime] NOT NULL
   ) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

ID列是主键,VehicleID和TimeStamp上有非Clustered索引

CREATE NONCLUSTERED INDEX [IX_ChannelValue_TimeStamp_VehicleID] ON [dbo].[ChannelValue] 
(
    [TimeStamp] ASC,
    [VehicleID] ASC
)ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

我正在努力优化我的查询的表是超过2300万行,并且只是查询需要操作的大小的十分之一.

我需要为每个VehicleID返回最新的行.

我一直在查看StackOverflow上对这个问题的回答,我已经做了很多谷歌搜索,似乎有3或4种常见的方法在SQL Server 2005及更高版本上执行此操作.

到目前为止,我发现的最快的方法是以下查询:

SELECT cv.*
FROM ChannelValue cv
WHERE cv.TimeStamp = (
SELECT
    MAX(TimeStamp)
FROM ChannelValue
WHERE ChannelValue.VehicleID = cv.VehicleID
)
Run Code Online (Sandbox Code Playgroud)

使用表中的当前数据量,执行大约需要6秒,这在合理的限制范围内,但是在实时环境中,表将包含的数据量开始执行得太慢.

查看执行计划,我关心的是SQL Server正在做什么来返回行.

我无法发布执行计划图像,因为我的声誉不够高,但索引扫描正在解析表中的每一行,这使得查询速度下降太多.

执行计划

我尝试用几种不同的方法重写查询,包括使用SQL 2005 Partition方法,如下所示: …

t-sql sql-server performance database-performance greatest-n-per-group

16
推荐指数
1
解决办法
4960
查看次数

在SQLAlchemy中加入子查询

我有以下SQL查询(它是每组特定列中最大的一个,有3个要分组的东西):

select p1.Name, p1.nvr, p1.Arch, d1.repo, p1.Date
from Packages as p1 inner join
    Distribution as d1
    on p1.rpm_id = d1.rpm_id inner join (
        select Name, Arch, repo, max(Date) as Date
        from Packages inner join Distribution
            on Packages.rpm_id = Distribution.rpm_id
        where Name like 'p%' and repo not like '%staging'
        group by Name, Arch, repo
    ) as sq
    on p1.Name = sq.Name and p1.Arch = sq.Arch and d1.repo = sq.repo and p1.Date = sq.Date
    order by p1.nvr
Run Code Online (Sandbox Code Playgroud)

我正在尝试将其转换为SQLAlchemy.这是我到目前为止:

p1 = aliased(Packages)
d1 …
Run Code Online (Sandbox Code Playgroud)

python sql sqlalchemy greatest-n-per-group

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