我不确定解释问题的最佳方法。 我有一张类似于这个的表
+---------+------------+---------------+--+
| user_id | invoice_no | invoiced_hrs | |
+---------+------------+---------------+--+
| 1 | 1023 | 8.1234 | |
| 2 | 1023 | 1.1234 | |
| 1 | 1023 | 5.8765 | |
| 4 | 1085 | 6.7654 | |
| 4 | 1085 | 7.5435 | |
| 6 | 1022 | 5.6789 | |
+---------+------------+---------------+--+
我需要能够过滤我的查询,而不必将多个user_id与任何invoice_no相关联。只要只有一个user_id与之关联,重复的发票号就可以了。
我尝试做的只是保留发票上占大部分时间的用户的行。
答案 0 :(得分:0)
您可以这样做:
SELECT *
FROM table t
WHERE t.user_id = (SELECT t2.user_id
FROM table t2
GROUP BY t2.user_id
ORDER BY SUM(t2.invoiced_hrs) DESC
LIMIT 1)
这将使用户的所有行都有更多的小时开票。 在您的示例中:
| 4 | 1085 | 6.7654 | |
| 4 | 1085 | 7.5435 | |
请注意,内部查询将返回以下内容:
| 4 | 14.3089 | |
答案 1 :(得分:0)
试试这个:
select
t.*
from your_table t
inner join (
select
invoice_no,
user_id,
sum(invoiced_hrs) invoiced_hrs
from your_table
group by invoice_no, user_id
) t1 on t.invoice_no = t1.invoice_no and t.user_id = t1.user_id
inner join (
select
invoice_no,
max(invoiced_hrs) invoiced_hrs
from (
select
invoice_no,
user_id,
sum(invoiced_hrs) invoiced_hrs
from your_table
group by invoice_no, user_id
) t group by invoice_no
) t2 on t1.invoice_no = t2.invoice_no and t1.invoiced_hrs = t2.invoiced_hrs;
产地:
+---------+------------+--------------+
| user_id | invoice_no | invoiced_hrs |
+---------+------------+--------------+
| 6 | 1022 | 5.6789 |
| 1 | 1023 | 8.1234 |
| 1 | 1023 | 5.8765 |
| 4 | 1085 | 6.7654 |
| 4 | 1085 | 7.5435 |
+---------+------------+--------------+
5 rows in set (0.04 sec)
它获取invoice_no的user_id,其中包含总invoiced_hrs中的最大部分。
请注意,如果用户贡献的话,它会返回两个用户。