我有一个产品表,我每天在其中插入大约 150,000 条记录。它们中的大多数都是多余的,但由于新的到期日期,我需要保留它们。我每天从 30 个供应商中的大约 5 个那里获得产品提要。每个供应商都有大约 35,000 种独特的产品。任何产品都不能属于多个供应商。
创建表 vendor_prices ( id 序列主键, 供应商整数非空, sku 字符变化 (25) NOT NULL, category_name 字符变化(100)非空, 价格数字(8,5)非空, 没有时区的有效日期时间戳, 不带时区 DEFAULT 的 expire_date 时间戳(now() + '1 year'::interval) );
我正在尝试删除没有价格变化且不再是该产品的最后更新的不相关记录,例如:
生效日期价格 '2015-05-01' $1.99 '2015-05-02' $1.99删除 '2015-05-03' $1.59 '2015-05-04' $1.99 '2015-05-05' $1.99删除 '2015-05-06' $1.99保留新的到期日期
所以每次加载后(我认为一次对一个供应商来说会更容易)我想做某种删除。这是我想出的长期无效的解决方案。
CREATE OR REPLACE FUNCTION remove_vendor_price_dupes(_vendor integer)
RETURNS integer AS
$BODY$
BEGIN
-- Delete Redundant prices
delete from vendor_prices
where id in (
select id from (
select vp1.id, vp1.vendor, …Run Code Online (Sandbox Code Playgroud) postgresql performance delete greatest-n-per-group postgresql-performance
考虑下product表(高度精简):
`id` int AUTO_INCREMENT
`category_id` int
`subcategory_id` int
`vendor_id` int
`price` decimal(6,2)
`inserted_at` timestamp
Run Code Online (Sandbox Code Playgroud)
对于给定的类别 ID,我试图检索包含每个子类别最新价格最低的供应商的列表。“最新”是指供应商可能对给定的类别 ID/子类别 ID 组合有多个价格,因此只应使用该类别 ID/子类别 ID/供应商 ID 的最近插入的价格。如果 2 个或更多供应商的价格之间存在平局,则应使用最低的 ID 作为决胜局。
例如,使用此数据:
id | category_id | subcategory_id | vendor_id | price | inserted_at
---------------------------------------------------------------------------
1 | 1 | 2 | 3 | 16.00 | 2015-07-23 04:00:00
2 | 1 | 1 | 2 | 9.00 | 2015-07-26 08:00:00
3 | 1 | 2 | 4 | 16.00 | 2015-08-02 10:00:00
4 | …Run Code Online (Sandbox Code Playgroud) 我有一个 SQL Server 2012 表,其中包含这样的列:
ID int NOT NULL,
EventDate datetime NOT NULL,
... 32 other columns...
Run Code Online (Sandbox Code Playgroud)
其中该表在大约 10000 个不同的 ID 值范围内有大约 50 亿行。
该表有一个唯一的聚集索引,如下所示:
CREATE UNIQUE CLUSTERED INDEX [MyIndex] ON [dbo].[MyTable] (
[ID] ASC,
[EventDate] ASC
)
Run Code Online (Sandbox Code Playgroud)
我需要找到最早的每个 ID 的 EventDate,我可以使用以下查询获得它:
SELECT ID, min(EventDate) FROM [dbo].[MyTable] GROUP BY ID
Run Code Online (Sandbox Code Playgroud)
但是,此查询只需不到 2 分钟即可完成。
由于 NDA 限制,我无法分享我正在查看的问题的细节(查询计划等),但我可以建议我看到的是聚集索引扫描,因此它正在检查表中的所有行。鉴于数据是按 EventDate 序列组织的,我希望检索速度会快得多,但我不太确定如何。任何其他特定于 ID 的范围查询都会在几毫秒内响应,并且该表最近已重建并重新编制索引,因此我认为没有任何统计更新会有所帮助。
任何人都可以建议一种更好的方法来确定避免扫描整个聚集索引的最小 per-ID EventDate 值吗?
我确实有一个包含(10,000)个不同id值的表格。
performance sql-server sql-server-2012 greatest-n-per-group query-performance
我正在尝试为表中的每个找到最新的 unit_status和该状态 ( )的时间戳。cdtsunid
这是我到目前为止想出的:
with cte as
(
select *
from un_hi
where ag_id = 'bfd' and cdts > '201708' and
unit_status != 'uc'
)
select distinct(unid), max(cdts2) Last_GPS_Report_Date
from cte
where unid in ('C06','C07','D01','D03','D04','D06')
group by unid
order by unid
Run Code Online (Sandbox Code Playgroud)
它正确地返回每个unid和时间的他们的最新状态(max(cdts)),但我想看看有什么unit_status了。
我尝试将这个查询加入到UN_HI表中(这是数据的来源),但我无法让它工作。还有其他建议吗?
查看下面的示例,从第一行 ( id=9)开始,然后向下工作,选择我们尚未看到的具有's的行数限制。我们“选择”是因为我们还没有. 我们继续像这样往下工作,但是当我们到达时我们跳过它,因为我们已经有了(从行开始)。我们以同样的方式继续,我们最终停下来,因为我们已经积累了行(我们想要的限制)。4secid=9sec=1id=7sec=5id=8id=34
id | sec
----+-----
9 | 1 <- 1
8 | 5 <- 2
7 | 5 # skip, already have sec=5
6 | 4 <- 3
5 | 1 # skip, already have sec=1
4 | 1 # skip, already have sec=1
3 | 3 <- 4
2 | 2
1 | 1
Run Code Online (Sandbox Code Playgroud)
当然,SQL算法可以(将!)与我描述的不同。
想要的结果:
id
----
9
8
6
3 …Run Code Online (Sandbox Code Playgroud) 我有两个对象的一些数据,我想检索两个对象的最后一行,最好是在一个查询中。
表结构:
CREATE TABLE data
(
pid serial NOT NULL,
dt timestamp without time zone,
object_id integer,
info_1 numeric(10,8),
speed numeric,
CONSTRAINT dat_pid PRIMARY KEY (pid)
)
Run Code Online (Sandbox Code Playgroud)
样本数据:
1, 2014-04-29 12:02:56, 8, ....
2, 2014-04-29 12:02:10, 8, ....
3, 2014-04-29 12:01:02, 8, ....
5, 2014-04-29 12:01:32, 6, ....
.....
Run Code Online (Sandbox Code Playgroud)
我想要每个唯一的对象 ID 一行,每一行都是可用的最新行。我试图通过使用此查询来实现它,但它希望 pid 位于 group by 子句中。但我不想按 PID 分组,而是按跟踪器 ID 分组....
SELECT *
FROM data
GROUP BY object_id
Run Code Online (Sandbox Code Playgroud) 假设我有以下数据:
| f1 | f2 | f3 |
|----|----|----|
| 1 | 1 | 1 |
| 1 | 1 | 5 |
| 1 | 2 | 3 |
| 1 | 2 | 6 |
| 1 | 3 | 4 |
| 1 | 3 | 7 |
| 2 | 1 | 2 |
| 2 | 1 | 22 |
| 2 | 2 | 3 |
| 2 | 2 | 4 |
Run Code Online (Sandbox Code Playgroud)
每个 …
我有一个us_customers看起来像这样的表(有数十万行):
+----------+----------+
| id | us_state |
+----------+----------+
| 12345678 | MA |
| 23456781 | AL |
| 34567812 | GA |
| 45678123 | FL |
| 56781234 | AZ |
| 67812345 | MA |
| 78123456 | CO |
| 81234567 | FL |
+----------+----------+
Run Code Online (Sandbox Code Playgroud)
...我想n从每个us_state.
有没有办法在 PostgreSQL 9.3 中干净利落地做到这一点?
我可以通过以下方式us_state轻松地从每个客户那里获得一位客户:
SELECT DISTINCT ON (us_state) id
FROM us_customers
ORDER BY us_state;
Run Code Online (Sandbox Code Playgroud)
但是,如果我想要来自每个州的三个客户,有没有一种方法可以在不多次运行相同查询的情况下做到这一点?
当我运行以下查询时,
SELECT engines, manufacturer, model, MAX(seats)
FROM planes
GROUP BY engines;
Run Code Online (Sandbox Code Playgroud)
我得到了正确的引擎和座椅结果,但不是正确的制造商、型号组合。此外,我需要的座位数有多个具有相同最大值的行,但引擎/座位只得到一个结果。我已经查看了其他 Stack Exchange 帖子和其他地方,但似乎找不到解决查询的好方法。有什么建议吗?
我有一个表格显示特定设备在给定时间戳的状态(0 - 损坏,1 - 实时):
device_owner device_id timestamp status
owner1 device_1 2001-01-01 09:00 0 -- leave this
owner1 device_1 2001-01-01 09:05 0 -- exclude
owner1 device_1 2001-01-01 09:10 0 -- exclude
owner1 device_2 2001-01-01 09:15 0 -- leave this
owner1 device_1 2001-01-01 09:30 1
owner1 device_2 2001-01-01 09:35 0 -- exclude
owner1 device_2 2001-01-01 09:45 1
owner1 device_1 2001-01-01 09:55 0 --leave this
owner1 device_1 2001-01-01 10:10 0 --exclude
owner1 device_1 2001-01-01 10:11 1
Run Code Online (Sandbox Code Playgroud)
等等。
我需要排除连续的零状态,并保留日期时间最早的状态。(这样我就可以定义设备损坏和活动之间的日期时间差异。)
结果:
device_owner device_id timestamp …Run Code Online (Sandbox Code Playgroud) postgresql ×4
sql-server ×3
mysql ×2
performance ×2
aggregate ×1
delete ×1
distinct ×1
group-by ×1
select ×1
top ×1