Postgresql Postgres连接和独立查询
我有两个标签Postgresql Postgres连接和独立查询,postgresql,Postgresql,我有两个标签 user id | name ------------- 1 | User1 | 2 | User2 | 3 | User3 | 4 | User4 | 用户可以随时更改名称。 还有一张桌子 order id |user_name | user_id | price | order_date ------------------------------------------
user
id | name
-------------
1 | User1 |
2 | User2 |
3 | User3 |
4 | User4 |
用户可以随时更改名称。
还有一张桌子
order
id |user_name | user_id | price | order_date
---------------------------------------------
1 | OldUser3| 3 | 5 | 2017-07-12 08:01:00.000000
2 | NewUser3| 3 | 6 | 2017-07-12 09:01:00.000000
3 | User1 | 1 | 8 | 2017-07-12 10:01:00.000000
4 | NewUser | | 10 | 2017-07-12 11:01:00.000000
5 | NewUser | | 100 | 2017-07-12 12:01:00.000000
用户名是在下订单时从tabel user复制的,如果用户多次更改名称,则可能会有不同的值
如果不是注册用户,则用户\u id可以为空
我需要这样的结果表
order
no |user_name | user_id | total_pr| count | last_order
---------------------------------------------
1 | NewUser3| 3 | 11 | 2 |2017-07-12 09:01:00.000000
2 | User1 | 1 | 8 | 1 |2017-07-12 10:01:00.000000
3 | NewUser | | 10 | 1 |2017-07-12 11:01:00.000000
4 | NewUser | | 100 | 1 |2017-07-12 12:01:00.000000
用户名值必须取自最大订单日期,并且需要按任何列排序
如果user_id为null,则所有同名用户都是不同的用户
我试试这个
SELECT order.user_id, order.user_name, SUM(price), COUNT(order.user_id), MAX(order_date)
FROM order, user
WHERE
order.order_date >= '2017-07-01 08:01:00.000000'
AND order.order_date <= '2017-07-15 08:01:00.000000'
GROUP BY user_id, user_name ORDER BY count ASC
但这并不是全部试试:
SELECT order.id, order.user_name, SUM(price), COUNT(order.user_id), MAX(order_date)
FROM order
LEFT OUTER JOIN user on order.user_id = user.id
WHERE
order.order_date >= '2017-07-01 08:01:00.000000'
AND order.order_date <= '2017-07-15 08:01:00.000000'
GROUP BY user_id, user_name ORDER BY count ASC
试试这个
with users_cte (user_name,user_id,total_pr,count,last_order) as (
--Fetching data for members who are in users table
Select user_name,user_id,total_pr,count,last_order from (
SELECT o.user_name, o.user_id, row_number() over (partition by o.user_id order by order_date desc) rno
, SUM(price) over (partition by o.user_id) as total_pr, COUNT(o.user_id) over(partition by o.user_id) as count , MAX(order_date) over (partition by o.user_id) as last_order
FROM orders o
left join users u
on o.user_id = u.id
WHERE
u.id is not null
and o.order_date >= '2017-07-01 08:01:00.000000'
AND o.order_date <= '2017-07-15 08:01:00.000000'
) A WHere A.rno=1
union all
--Fetching data for new members
SELECT o.user_name,null as user_id
, SUM(price) as total_pr, COUNT(o.user_name), MAX(order_date)
FROM orders o
left join users u
on o.user_id = u.id
WHERE
u.id is null
and o.order_date >= '2017-07-01 08:01:00.000000'
AND o.order_date <= '2017-07-15 08:01:00.000000'
GROUP BY o.user_name
)
Select row_number() over(order by last_order) as no,* from users_cte
编号|用户名|用户名|用户id |总数|计数|最后一批订单df 4 0 2017-07-12 13:54:12.173724 5 df 5 0 2017-07-12 13:54:12.173724 3 df 3 0 2017-07-12 13:54:12.173724 2 grt 2 1 2017-07-12 13:54:12.173724 gg 1 1 1 2017-07-12 13:54:12.173724所以接近用户1 8 1 1 2017-07-12-12:13:54:12:12新用户1 17327-12:12110 0 2017-07-12 13:54:12.173724非常接近,非常感谢!!!!!!!!!!!工作不错,我浪费了很多时间去寻找解决方案。