标签: greatest-n-per-group

在SQL中选择一个不在Group By中的列

我一直试图找到一些关于如何选择SQL中的Group By语句中未包含的非聚合列的信息,但到目前为止我找到的任何内容似乎都没有回答我的问题.我有一张桌子,上面有三列,我想要它.一个是创建日期,一个是通过特定声明ID对记录进行分组的ID,最后一个是PK.我想在每组声明ID中找到具有最大创建日期的记录.我选择了MAX(创建日期)和Claim ID(cpe.fmgcms_cpeclaimid),并按照声明ID进行分组.但是我需要来自这些记录的PK(cpe.fmgcms_claimid),如果我尝试将它添加到我的select子句中,我会收到错误.而且我不能将它添加到我的group by子句中,因为它会抛弃我想要的分组.有谁知道这方面的任何变通办法?以下是我的代码示例:

Select MAX(cpe.createdon) As MaxDate, cpe.fmgcms_cpeclaimid 
from Filteredfmgcms_claimpaymentestimate cpe
where cpe.createdon < 'reportstartdate'
group by cpe.fmgcms_cpeclaimid
Run Code Online (Sandbox Code Playgroud)

这是我想得到的结果:

Select MAX(cpe.createdon) As MaxDate, cpe.fmgcms_cpeclaimid, cpe.fmgcms_claimid 
from Filteredfmgcms_claimpaymentestimate cpe
where cpe.createdon < 'reportstartdate'
group by cpe.fmgcms_cpeclaimid
Run Code Online (Sandbox Code Playgroud)

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

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

SQL查询以选择具有最小值的不同行

我想要一个SQL语句来获取具有最小值的行.

考虑一下这个表:

id  game   point
1    x      5
1    z      4
2    y      6
3    x      2
3    y      5
3    z      8
Run Code Online (Sandbox Code Playgroud)

如何选择列中具有最小值的ID point,按游戏分组?像这样:

id  game   point    
1    z      4
2    y      5
3    x      2   
Run Code Online (Sandbox Code Playgroud)

sql database greatest-n-per-group

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

优化GROUP BY查询以检索每个用户的最新记录

我在Postgres 9.2中有下表(简化形式)

CREATE TABLE log (
    log_date DATE,
    user_id  INTEGER,
    payload  INTEGER
);
Run Code Online (Sandbox Code Playgroud)

它每个用户和每天最多包含一条记录.每天将有大约500,000条记录,为期300天.每个用户的running_total总是在增加.

我想在特定日期之前有效地检索每个用户的最新记录.我的查询是:

SELECT user_id, max(log_date), max(payload) 
FROM log 
WHERE log_date <= :mydate 
GROUP BY user_id
Run Code Online (Sandbox Code Playgroud)

这非常慢.我也尝试过:

SELECT DISTINCT ON(user_id), log_date, payload
FROM log
WHERE log_date <= :mydate
ORDER BY user_id, log_date DESC;
Run Code Online (Sandbox Code Playgroud)

具有相同的计划,同样缓慢.

到目前为止,我在user_msg_log(aggr_date)上有一个索引,但没有多大帮助.我应该用什么其他索引来加快速度,还是以任何其他方式实现我的目标?

sql postgresql indexing greatest-n-per-group postgresql-performance

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

如何在SQL查询中排序LEFT JOIN的顺序?

好吧我试着谷歌搜索疯狂的答案,但我无法解决这个问题,所以我希望有人能够提供帮助.

假设我有一个用户表,非常简单的表:

id | userName
3    Michael
4    Mike
5    George
Run Code Online (Sandbox Code Playgroud)

我还有另一张他们的汽车和价格表.

id | belongsToUser | carPrice
1    4               5000
2    4               6000
3    4               8000
Run Code Online (Sandbox Code Playgroud)

现在我需要做的是这样的事情(随意重写):

   SELECT
      `userName`,
      `carPrice`
   FROM `users`
   LEFT JOIN `cars`
   ON cars.belongsToUser=users.id
   WHERE `id`='4'
Run Code Online (Sandbox Code Playgroud)

哪个回报:

Mike | 5000
Run Code Online (Sandbox Code Playgroud)

但我需要某个用户最贵的车,而不是第一个找到的车.

所以问题:如何设置要由carPrice,DESC订购的LEFT JOIN表?

mysql sql greatest-n-per-group

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

一起使用ORDER BY和GROUP BY

我的表看起来像这样(我正在使用MySQL):

m_id | v_id | timestamp
------------------------
6    |   1  | 1333635317
34   |   1  | 1333635323
34   |   1  | 1333635336
6    |   1  | 1333635343
6    |   1  | 1333635349
Run Code Online (Sandbox Code Playgroud)

我的目标是每次m_id,并按最高时间戳排序.

结果应该是:

m_id | v_id | timestamp
------------------------
6    |   1  | 1333635343
34   |   1  | 1333635336
Run Code Online (Sandbox Code Playgroud)

我写了这个查询:

SELECT * FROM table GROUP BY m_id ORDER BY timestamp DESC
Run Code Online (Sandbox Code Playgroud)

但是,结果是:

m_id | v_id | timestamp
------------------------
34   |   1  | 1333635323
6    |   1  | 1333635317
Run Code Online (Sandbox Code Playgroud)

我认为这是因为它首先执行GR​​OUP_BY然后对结果进行ORDER. …

mysql sql group-by greatest-n-per-group

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

如何使用GROUP BY获取每组中的最新记录?

假设我有一个messages用列调用的表:

id | from_id | to_id | subject | message | timestamp
Run Code Online (Sandbox Code Playgroud)

我想只收到每个用户的最新消息,就像您在深入了解实际线程之前在FaceBook收件箱中看到的那样.

这个查询似乎让我接近我需要的结果:

SELECT * FROM messages GROUP BY from_id
Run Code Online (Sandbox Code Playgroud)

但是,查询给了我每个用户最早的消息,而不是最新消息.

我无法想出这个.

mysql sql greatest-n-per-group

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

FORCE INDEX mySQL ...我把它放在哪里?

我有以下mySQL查询,完全正常.除了我需要添加"FORCE INDEX",我不确定我必须在哪里做到这一点.我尝试了几乎每个位置,并始终收到mySQL错误.我究竟做错了什么?

这是原始查询:

$sql_select_recent_items = $db->query("SELECT * FROM (SELECT owner_id, product_id, start_time, price, currency, name, closed, active, approved, deleted, creation_in_progress FROM db_products ORDER BY start_time DESC) as resultstable
WHERE resultstable.closed=0 AND resultstable.active=1 AND resultstable.approved=1 AND resultstable.deleted=0 AND resultstable.creation_in_progress=0
GROUP BY resultstable.owner_id
ORDER BY start_time DESC");
Run Code Online (Sandbox Code Playgroud)

查询以这种方式构造,以便我可以在"GROUP BY"之前执行"ORDER BY",以防您想知道.

我需要补充的是:

FORCE INDEX (products_start_time)
Run Code Online (Sandbox Code Playgroud)

我在几乎没有成功的地方试过它,这让我相信有一些我更缺失的东西更复杂?

mysql indexing greatest-n-per-group

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

PostgreSQL MAX和GROUP BY

我有一张桌子id,yearcount.

我想得到MAX(count)每个id并保持year它发生的时间,所以我做这个查询:

SELECT id, year, MAX(count)
FROM table
GROUP BY id;
Run Code Online (Sandbox Code Playgroud)

不幸的是,它给了我一个错误:

错误:列"table.year"必须出现在GROUP BY子句中或用于聚合函数

所以我尝试:

SELECT id, year, MAX(count)
FROM table
GROUP BY id, year;
Run Code Online (Sandbox Code Playgroud)

但是,它没有做MAX(count),它只是显示表格.我想是因为分组的时候yearid,它得到最大的id是特定年份的.

那么,我该如何编写该查询呢?我想要得到idMAX(count),并在今年这种情况发生的时候.

sql postgresql group-by max greatest-n-per-group

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

SQL Left仅加入第一个匹配

我有一个针对大量连接的大表(行和列)的查询,但是其中一个表有一些重复的数据行导致我的查询出现问题.由于这是来自其他部门的只读实时订阅源,因此我无法修复该数据,但我正在尝试阻止查询中的问题.

鉴于此,我需要将此垃圾数据作为左连接添加到我的好查询中.数据集如下所示:

IDNo    FirstName   LastName    ...
-------------------------------------------
uqx     bob     smith
abc     john        willis
ABC     john        willis
aBc     john        willis
WTF     jeff        bridges
sss     bill        doe
ere     sally       abby
wtf     jeff        bridges
...
Run Code Online (Sandbox Code Playgroud)

(约24列,100K行)

我的第一直觉是执行一个明显的给了我大约80K行:

SELECT DISTINCT P.IDNo
FROM people P
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试以下操作时,我会收到所有行:

SELECT DISTINCT P.*
FROM people P
Run Code Online (Sandbox Code Playgroud)

要么

SELECT 
    DISTINCT(P.IDNo) AS IDNoUnq 
    ,P.FirstName
    ,P.LastName
    ...etc.    
FROM people P
Run Code Online (Sandbox Code Playgroud)

然后我想我会在所有列上执行FIRST()聚合函数,但是这也感觉不对.从语法上讲,我在这里做错了吗?

更新: 只是想注意:这些记录是基于上面列出的非密钥/非索引字段ID的重复记录.ID是一个文本字段,虽然具有相同的值,但它与导致该问题的其他数据的情况不同.

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

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

T-SQL:根据MAX选择列(其他列)

我希望有一种简单的方法可以在不使用子查询的情况下执行此操作:

场景:您有"TableA",其中包含"Key","SubKey"和"Value"列.对于给定的"Key",我需要获得MAX("SubKey")的"Value".

因此,如果表包含行:

KEY SUBKEY VALUE
1   1      100
1   2      200
1   3      300
Run Code Online (Sandbox Code Playgroud)

对于Key = 1,我需要值300.我希望做到这样的事情:

SELECT
  VALUE
FROM
  TableA
WHERE
  Key = 1
HAVING
  SubKey = MAX(SubKey)
Run Code Online (Sandbox Code Playgroud)

但那是不行的.有没有办法在不执行'WHERE SubKey =(subselect for max subkey)'的情况下执行此操作?

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

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