【发布时间】:2021-12-10 08:59:41
【问题描述】:
我正在尝试在我的数据库中获取分层数据。这是我的初始代码。
SELECT TOP 5
year, location_state, location_city,
COUNT(tf.customer_key) Number_of_Customers
FROM TransactionFact tf
JOIN LocationDim as ld
ON ld.location_key = tf.seller_location_key
JOIN DateDim dd
ON dd.date_key = tf.order_date_key
WHERE dd.year = 2016 and location_state = 'SP'
GROUP BY dd.year, ld.location_state, ld.location_city
ORDER BY dd.year DESC, Number_of_Customers DESC
这是结果,result。
基本上,在查询中,我想做的是不对WHERE 子句中的location_state 进行硬编码。我想让它动态化,以便我得到每个州的前 5 个 城市。 p>
这是 LocationDim 表的列名
location_key
location_zip_code_prefix
location_state
location_city
编辑: 我需要的是这样的东西。
+------+----------------+---------------+---------------------+
| year | location_state | location_city | Number_of_Customers |
+------+----------------+---------------+---------------------+
| 2016 | STATE_1 | city_1 | 100 |
+------+----------------+---------------+---------------------+
| 2016 | STATE_1 | city_2 | 90 |
+------+----------------+---------------+---------------------+
| 2016 | STATE_1 | city_3 | 89 |
+------+----------------+---------------+---------------------+
| 2016 | STATE_1 | city_4 | 88 |
+------+----------------+---------------+---------------------+
| 2016 | STATE_1 | city_5 | 20 |
+------+----------------+---------------+---------------------+
| 2016 | STATE_2 | city_1 | 100 |
+------+----------------+---------------+---------------------+
| 2016 | STATE_2 | city_2 | 45 |
+------+----------------+---------------+---------------------+
| 2016 | STATE_2 | city_3 | 23 |
+------+----------------+---------------+---------------------+
| 2016 | STATE_2 | city_4 | 10 |
+------+----------------+---------------+---------------------+
| 2016 | STATE_2 | city_5 | 5 |
+------+----------------+---------------+---------------------+
PS:抱歉,这是我在 stackoverflow 中的第一个问题。如果这个问题是重复的,请删除链接,我会试一试。提前谢谢你。
【问题讨论】:
-
这能回答你的问题吗? Get top 1 row of each group
-
@Charlieface,我想我很难读懂那个,因为我不知道 CTE 是如何工作的。我仍然需要弄清楚这一点。我希望有一个更简单的方法。谢谢
-
标准答案与@LukStorms 答案几乎相同:只需添加一个分区行号并按此过滤即可。您将整个查询放入带有行号的派生表中,然后在该表之外进行过滤(因为您无法从同一级别过滤
ROW_NUMBER)。旁白:COUNT(tf.customer_key)与COUNT(*)相同,它只计算非空行。如果您想要不同customer_key的计数,则需要COUNT(DISTINCT tf.customer_key) -
@Charlieface 是的,它解决了我的问题。我已经对他的回答投了赞成票,但我不确定为什么他的回答中没有绿色。
标签: sql-server tsql