sql - T-SQL GROUP BY:消除多次出现
问题描述
由于日期值不同,如何防止以下查询中出现多个相同的价格行?我只需要显示价格与之前的记录不同的记录的第一次出现,但跳过直到价格字段再次发生变化。
SELECT STOCKID, PRICE, TRANSTYPENAME, TRANSDATE
FROM VE_STOCKTRANS
WHERE STOCKID = 6000 AND TANSTYPE IN (3500,3553)
GROUP BY PRICE, STOCKID, TRANSTYPENAME, TRANSDATE
即我需要省略多个 35.83333333 行,只取它的第一次出现(24/4/2018)
图片回复戈登的回答:
解决方案
用于LAG()
查看价格是否发生变化:
SELECT STOCKID, PRICE, TRANSTYPENAME, TRANSDATE
FROM (SELECT st.*,
LAG(st.price) OVER (PARTITION BY stockId ORDER BY transdate) as prev_price
FROM VE_STOCKTRANS st
WHERE STOCKID = 6000 AND TANSTYPE IN (3500, 3553)
) st
WHERE prev_price IS NULL OR prev_price <> price;
编辑:
如果您只想要第一次看到每个价格的列表(这与价格变化完全不同,正如您在问题中指出和描述的那样),请使用row_number()
:
SELECT STOCKID, PRICE, TRANSTYPENAME, TRANSDATE
FROM (SELECT st.*,
ROW_NUMBER() OVER (PARTITION BY st.stockId, st.price ORDER BY st.transdate) as seqnum
FROM VE_STOCKTRANS st
WHERE STOCKID = 6000 AND TANSTYPE IN (3500, 3553)
) st
WHERE seqnum = 1;
推荐阅读
- spring - 双选一个字段,怎么解决?
- java - Mockito NoSuchElementException when() findById() get() thenReturn()
- java - 如何使用 java 在 i 和 i+1 索引处打印数组的索引?
- java - Elastic - 使用 Java 高级 Rest 客户端执行字符串查询
- php - Rust regex replace_all 比 PHP regex preg_replace_callback 慢,如何优化?
- haskell - writeTVar 的不安全版本
- java - 无法使用正则表达式将第一个字母更改为大写,其余为小写
- java - 如何修复递归函数的返回值*2错误
- c - 为什么 X11 在 _NET_ACTIVE_WINDOW 改变值的情况下会发送两个事件?
- c++ - 了解 C++ 标准的移动语义