与 - 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) 有两个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 …
好的,我有一个这样的表:
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都不同.我需要加入吗?
我有一个包含以下列的表
部分数据可能如下所示:
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执行此操作?
我在匹配表中有以下数据:
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)
但这回归:
Run Code Online (Sandbox Code Playgroud)ERROR: could not identify an equality operator for type json SQL state: 42883 Character: 1680
我知道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) 我有一个包含客户信息的表.为每个客户分配一个客户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) 我有一个相当有趣的情况.我有一个充满地址和消息的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) 根据Course下面的表格:

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

如果我在Course表中有两个日期列,即StartDate和EndDate,我想仅基于EndDate显示相同的内容.
我正在使用PostgreSQL.
这是我发现自己的情景.
我有一个相当大的表,我需要查询来自的最新记录.以下是查询基本列的创建:
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
我有以下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) sql ×8
sql-server ×5
t-sql ×4
postgresql ×3
android ×1
database ×1
distinct-on ×1
json ×1
lateral ×1
max ×1
performance ×1
python ×1
sqlalchemy ×1
sqlite ×1