过去几天,我一直在尝试解决问题,但不知道解决方案是什么...
我有一个如下表:
+--------+-----------+-------+
| ShopID | ArticleID | Price |
+--------+-----------+-------+
| 1 | 3 | 150 |
| 1 | 2 | 80 |
| 3 | 3 | 100 |
| 4 | 2 | 95 |
+--------+-----------+-------+
我想选择一对商店ID,同一商品的价格较高。 F.e.看起来应该像这样:
+----------+----------+---------+
| ShopID_1 | ShopID_2 |ArticleID|
+----------+----------+---------+
| 4 | 1 | 2 |
| 1 | 3 | 3 |
+----------+----------+---------+
...显示在ShopID 4中,第2条的价格要比在ShopID 2中高。等等。
到目前为止,我的代码如下:
SELECT ShopID AS ShopID_1, ShopID AS ShopID_2, ArticleID FROM table
WHERE table.ArticleID=table.ArticleID and table.Price > table.Price
但是它没有给出我要搜索的结果。
有人可以帮助我实现这一目标吗?非常感谢。
答案 0 :(得分:2)
这里的问题是关于计算每个组的前N个项目。
假设您在表sales
中具有以下数据。
# select * from sales;
shopid | articleid | price
--------+-----------+-------
1 | 2 | 80
3 | 3 | 100
4 | 2 | 95
1 | 3 | 150
5 | 3 | 50
通过以下查询,我们可以为每个ArticleId
select
ArticleID,
ShopID,
Price,
row_number() over (partition by ArticleID order by Price desc) as Price_Rank from sales;
这将导致:
articleid | shopid | price | price_rank
-----------+--------+-------+------------
2 | 4 | 95 | 1
2 | 1 | 80 | 2
3 | 1 | 150 | 1
3 | 3 | 100 | 2
3 | 5 | 50 | 3
然后,我们只需为每个AritcleId选择前2个项目:
select
ArticleID,
ShopID,
Price
from (
select
ArticleID,
ShopID,
Price,
row_number() over (partition by ArticleID order by Price desc) as Price_Rank
from sales) sales_rank
where Price_Rank <= 2;
这将导致:
articleid | shopid | price
-----------+--------+-------
2 | 4 | 95
2 | 1 | 80
3 | 1 | 150
3 | 3 | 100
最后,我们可以使用crosstab
函数来获取预期的透视图。
select *
from crosstab(
'select
ArticleID,
ShopID,
ShopID
from (
select
ArticleID,
ShopID,
Price,
row_number() over (partition by ArticleID order by Price desc) as Price_Rank
from sales) sales_rank
where Price_Rank <= 2')
AS sales_top_2("ArticleID" INT, "ShopID_1" INT, "ShopID_2" INT);
结果:
ArticleID | ShopID_1 | ShopID_2
-----------+----------+----------
2 | 4 | 1
3 | 1 | 3
注意:
如果出现错误CREATE EXTENSION tablefunc;
,您可能需要致电function crosstab(unknown) does not exist
。
答案 1 :(得分:0)
此查询应工作:
SELECT t1.ShopID AS ShopID_1, t2.ShopID AS ShopID_2, t1.ArticleID
FROM <yourtable> t1 JOIN
<yourtable> t2
ON t1.ArticleID = t2.ArticleID AND t1.Price > t2.Price;
也就是说,您需要一个自联接和适当的表别名。