一個示例表:
| 視頻 | 編碼 | 花費的視頻時間 | 編碼位元組 | 編碼位元組運行總和 | 視頻花費的總和(預期) | 視頻花費的總和(實際) |
|---|---|---|---|---|---|---|
| 一種 | 1 | 1 | 500 | 500 | 1 | 1 |
| 一種 | 2 | 1 | 400 | 900 | 1 | 2 |
| 乙 | 3 | 2 | 300 | 1200 | 3 | 5 |
| 乙 | 4 | 2 | 200 | 1400 | 3 | 8 |
| 乙 | 5 | 2 | 100 | 1500 | 3 | 11 |
| 乙 | 6 | 2 | 100 | 1600 | 3 | 14 |
- 視頻花費時間列包含觀看視頻的時間;觀看了哪種編碼并不重要。
- 視頻花費的總和是我想要得到的。它應該只總結在視頻級別花費的時間,而忽略編碼。
我想選擇盡可能多的編碼位元組,同時保持視頻時間總和 < X。
到目前為止我的查詢:
SELECT *
FORM (
SELECT
...,
SUM(encoding_bytes) OVER(ORDER BY encoding_bytes desc) AS encoding_bytes_running_sum,
SUM(video_time_spent) OVER (ORDER BY encoding_bytes desc) AS video_time_spent_running_sum
...
)
WHERE video_time_spent_running_sum < X
但是 video_time_spent_running_sum 不夠聰明,無法跳過同一視頻中的其他編碼。什么是最好的方法來做到這一點?
每個視頻的編碼數量不是恒定的。
創建表的腳本:
SELECT
*,
SUM(encoding_bytes) OVER(
ORDER BY
encoding_bytes DESC
) AS encoding_bytes_running_sum,
SUM(video_time_spent) OVER (
ORDER BY
encoding_bytes DESC ROWS UNBOUNDED PRECEDING
) AS video_time_spent_running_sum
FROM (
VALUES
('a', 1, 1, 500),
('a', 2, 1, 400),
('b', 3, 2, 300),
('b', 4, 2, 200),
('b', 5, 2, 100),
('b', 6, 2, 100)
) AS t (video, encoding, video_time_spent, encoding_bytes)
uj5u.com熱心網友回復:
一種方法如下(我相信它可以簡化);您使用該ROW_NUMBER函式僅計算每個視頻的第一行。
WITH cte AS (
SELECT
*
, SUM(encoding_bytes) OVER (ORDER BY encoding_bytes DESC) AS encoding_bytes_running_sum
--, SUM(video_time_spent) OVER (ORDER BY encoding_bytes DESC ROWS UNBOUNDED PRECEDING) AS video_time_spent_running_sum
, ROW_NUMBER() OVER (PARTITION BY video ORDER BY video, [encoding]) rn
FROM (
VALUES
('a', 1, 1, 500),
('a', 2, 1, 400),
('b', 3, 2, 300),
('b', 4, 2, 200),
('b', 5, 2, 100),
('b', 6, 2, 100)
) AS t (video, [encoding], video_time_spent, encoding_bytes)
)
SELECT video, [encoding], video_time_spent, encoding_bytes, encoding_bytes_running_sum
, SUM(CASE WHEN rn = 1 THEN video_time_spent ELSE 0 END) OVER (ORDER BY video ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) video_time_spent_running_sum
FROM cte;
這將回傳:
| 視頻編碼 | 視頻時間花費 | 編碼位元組數 | encoding_bytes_running_sum | video_time_spent_running_sum |
|---|---|---|---|---|
| 一種 | 1 | 1 | 500 | 500 |
| 一種 | 2 | 1 | 400 | 900 |
| 乙 | 3 | 2 | 300 | 1200 |
| 乙 | 4 | 2 | 200 | 1400 |
| 乙 | 5 | 2 | 100 | 1600 |
| 乙 | 6 | 2 | 100 | 1600 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/357308.html
標籤:sql sql-server 查询语句 窗函数
