【问题标题】:Sql get top row in each continues groupSql在每个继续组中获取第一行
【发布时间】:2014-10-29 11:37:12
【问题描述】:

我遇到了一个关于在每个组中获取第一行的 sql 问题。我搜索了现有的答案,这一切都是为了从不同的群体中获得第一名。在我的情况下,我有重复的组。例如,

此表按“放置日期”排序,我想得到的是组中的每一行,只要它们的“订单名称”或“订单量”与上一行不同。所以输出应该是这样的,

row_number...按功能分区在这里不起作用。我也试过按功能连接。但它似乎也不起作用。

提前致谢!

【问题讨论】:

  • 这是什么 RDBMS - oracle?
  • 是的,甲骨文。感谢您的回复平尼。答案是对你的 ref 使用 lag 函数。

标签: sql


【解决方案1】:

如果您使用的是 SQL Server,这将起作用:

CREATE TABLE #Test
(
OrderID     INT,
OrderName   VARCHAR(400),
OrderVolume INT,
PlacedDate  DATE,
Visit_Key   INT
)

INSERT INTO #Test VALUES(1,'A',24,'10/12/2012',432)
INSERT INTO #Test VALUES(2,'A',24,'10/13/2012',432)
INSERT INTO #Test VALUES(3,'A',24,'10/14/2012',432)
INSERT INTO #Test VALUES(4,'B',27,'10/18/2012',432)
INSERT INTO #Test VALUES(5,'B',27,'10/18/2012',432)
INSERT INTO #Test VALUES(6,'A',24,'11/25/2012',432)
INSERT INTO #Test VALUES(7,'A',24,'11/25/2012',432)
INSERT INTO #Test VALUES(8,'A',24,'11/25/2012',432)

CREATE TABLE #Test2
(
OrderID             INT,
OrderName           VARCHAR(400),
OrderVolume         INT,
PlacedDate          DATE,
Visit_Key           INT,
Prev_ordervol       INT
)
INSERT INTO #Test2
(
OrderID,            
OrderName,      
OrderVolume ,   
PlacedDate,     
Visit_Key,      
Prev_ordervol
)
SELECT
    MIN(OrderID) AS 'orderid',
    ordername,
    ordervolume,
    MIN(placeddate) AS 'placeddate',
    MIN(Visit_Key) AS 'visit_key',
    LAG(OrderVolume)  OVER (ORDER BY orderid) AS 'previous ordervol' 
FROM #Test
GROUP BY OrderVolume, ordername, orderid, placeddate



SELECT
    OrderID,
    OrderName,
    OrderVolume,
    PlacedDate,
    Visit_Key
FROM #Test2
WHERE OrderVolume != Prev_ordervol OR Prev_ordervol IS NULL

DROP TABLE #Test
DROP TABLE #Test2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 2010-10-20
    • 2011-08-10
    • 1970-01-01
    相关资源
    最近更新 更多