首页 > 解决方案 > 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)

在此处输入图像描述

图片回复戈登的回答:

在此处输入图像描述

标签: sqlsql-servertsql

解决方案


用于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;

推荐阅读