标签: greatest-n-per-group

删除重复的记录,中间没有变化

我有一个产品表,我每天在其中插入大约 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

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

MySQL 中多列的嵌套聚合和分组

考虑下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)

mysql aggregate greatest-n-per-group

5
推荐指数
2
解决办法
9859
查看次数

从聚集索引中找到每个项目最早日期的最佳方法是什么

我有一个 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

5
推荐指数
2
解决办法
509
查看次数

使用 GROUP BY 并返回超过 2 列

我正在尝试为表中的每个找到最新的 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表中(这是数据的来源),但我无法让它工作。还有其他建议吗?

sql-server-2008 sql-server greatest-n-per-group

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

选择指定数量的唯一 ID,其中第二列是唯一的

查看下面的示例,从第一行 ( 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)

postgresql select greatest-n-per-group

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

分组并显示每个结果最后一行的内容

我有两个对象的一些数据,我想检索两个对象的最后一行,最好是在一个查询中。

表结构:

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)

postgresql group-by postgresql-9.1 greatest-n-per-group

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

PostgreSQL 获取每个范围的 top-k 最小值

假设我有以下数据:

| 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)

每个 …

postgresql-9.3 greatest-n-per-group top

4
推荐指数
1
解决办法
162
查看次数

有没有办法 SELECT n ON (如 DISTINCT ON,但每个都不止一个)

我有一个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)

但是,如果我想要来自每个州的三个客户,有没有一种方法可以在不多次运行相同查询的情况下做到这一点?

postgresql greatest-n-per-group distinct

4
推荐指数
1
解决办法
1369
查看次数

具有相同最大值的多行

当我运行以下查询时,

SELECT engines, manufacturer, model, MAX(seats)
FROM   planes
GROUP BY engines;
Run Code Online (Sandbox Code Playgroud)

我得到了正确的引擎和座椅结果,但不是正确的制造商、型号组合。此外,我需要的座位数有多个具有相同最大值的行,但引擎/座位只得到一个结果。我已经查看了其他 Stack Exchange 帖子和其他地方,但似乎找不到解决查询的好方法。有什么建议吗?

mysql greatest-n-per-group

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

排除具有可能重复的连续数据的行

我有一个表格显示特定设备在给定时间戳的状态(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)

sql-server greatest-n-per-group

4
推荐指数
1
解决办法
297
查看次数