2017-09-26 135 views
-1

我有以下的列postgres的查询不同COUNT和ROW_NUMBER()

group_id BIGINT, 
user_id BIGINT, 
message_date timestamp 

用于右USER_ID的表消息我想能够总列数与USER_ID与计数时,不同的组这USER_ID,并考虑USER_ID的数量做了一个排行榜,位置太

我想这个查询

SELECT main.total_m, main.group_number, main.pos 
FROM (
    SELECT user_id, COUNT(group_id) AS group_number, COUNT(user_id) AS total_m, 
     ROW_NUMBER() OVER (
      PARTITION BY COUNT(user_id) 
      ORDER BY COUNT(user_id) DESC 
      ) AS pos 
    FROM messages 
    WHERE message_date > date_trunc('week', now()) 
    GROUP BY user_id, group_id 
) AS main 
WHERE user_id = %s 

,但我不明白的结果,我想有。我在哪里错了?

+0

提供样品数据和预期的结果。 –

回答

1

“样本数据”和“预期结果”的威力在于使他人能够高效回答。下面是一个完整的猜测,但也许它会提示你准备了 “Minimal, Complete, and Verifiable Example”(MCVE)

的detials下面可以SQL Fiddle

的PostgreSQL 9.6架构设置访问:

CREATE TABLE Messages 
    (USER_ID int, GROUP_ID int, MESSAGE_DATE timestamp) 
; 

INSERT INTO Messages 
    (USER_ID, GROUP_ID, MESSAGE_DATE) 
VALUES 
    (1, 7, '2017-09-01 10:00:00'), 
    (1, 6, '2017-09-02 10:00:00'), 
    (1, 5, '2017-09-03 10:00:00'), 
    (1, 4, '2017-09-04 10:00:00'), 
    (1, 7, '2017-09-05 10:00:00'), 
    (2, 6, '2017-09-01 10:00:00'), 
    (2, 5, '2017-09-02 10:00:00'), 
    (2, 7, '2017-09-03 10:00:00'), 
    (2, 6, '2017-09-04 10:00:00'), 
    (2, 4, '2017-09-05 10:00:00'), 
    (2, 8, '2017-09-11 10:00:00') 
; 

查询1

select 
     user_id 
    , num_grps 
    , num_msgs 
    , dense_rank() over(order by num_grps DESC, num_msgs DESC, max_date DESC, user_id) rnk 
from (
    select 
      user_id 
     , count(distinct group_id) num_grps 
     , count(*)     num_msgs 
     , max(message_date)  max_date 
    from messages 
    group by 
      user_id 
    ) d 

Results

| user_id | num_grps | num_msgs | rnk | 
|---------|----------|----------|-----| 
|  2 |  5 |  6 | 1 | 
|  1 |  4 |  5 | 2 | 
+0

谢谢你的回答是完美的。它真的解决了我的问题,但你错过了我的查询中的一部分:WHERE user_id =%s 我必须获取特定user_id的设置。 我试图在你的版本中加入 WHERE d.user_id =%s'但是然后'rnk'列总是1,每个id – 91DarioDev

+0

也许我应该把你的查询作为子查询,然后我添加父查询在哪里? – 91DarioDev

+0

正如你在处理这个问题时,请考虑回答最终目标未知的问题必须是什么样的情况.....你需要运行这整个查询,然后才能获得个人的正确排名用户。现在你需要考虑它的效率以及你真正想要做这些事情的频率等等,但是这些考虑完全超出了这个问题的范围。 –

0

看着刚刚内部查询,我看到这个选择:

SELECT user_id, COUNT(group_id), ... 

但这在GROUP BY:

GROUP BY user_id, group_id 

把那些在一起,你永远不会有一个COUNT()1以外的任何结果,因为每个group_id都有它自己的组。它适用于total_m列。

+0

那么我怎么能得到预期的结果呢?没有办法在一个查询中做到这一点? – 91DarioDev