簡體   English   中英

sql select min,從同一行的不同列返回值並進行分組

[英]sql select min, return value from different column in same row with grouping

我希望OrderType為每個Name的min(Date)。 所以,我想要這個:

Name    Date        OrderType
Alex    1/1/2014    Direct
Alex    9/15/2014   Distributor
Cindy   6/4/2014    Distributor
John    5/8/2014    Direct
John    2/14/2014   Distributor

要歸還:

Name    Date        OrderType
Alex    1/1/2014    Direct
Cindy   6/4/2014    Distributor
John    2/14/2014   Distributor

我們可以根據每個[Name]的日期獲取行號,並選擇最少的日期記錄。

SELECT [T].* 
FROM (  
    SELECT [Name]
         , [DATE]
         , [OrderType]
         , ROW_NUMBER() OVER (PARTITION BY [Name] ORDER BY [Date]) AS [seq]
    FROM [TableA]
) AS [T]
WHERE [T].[seq] = 1

我認為您需要選擇每人的最小日期然后加入到原始表中以獲取該行的類型。

假設您的表名為tab,每個人每個日期只有一個訂單(否則問題是不可能的),那么類似於:

Select t.name, t.date, t.ordertype
From tab t,
     ( select min (i.date) date, i.name from tab i group by i.name) t2
Where t.date = t2.date
  And t.name = t2.name

對不起我主要使用mysql和Oracle而不是tsql所以它是通用的sql語法。

CREATE TABLE #tmp
( Name VARCHAR(50), orderdate DATE, OrderType VARCHAR(50) )
INSERT #tmp ( Name, orderdate, OrderType )
VALUES  ( 'Alex', '01/01/2014','Direct')
INSERT #tmp
VALUES  ( 'Alex', '9/15/2014','Distributor')
INSERT #tmp
VALUES  ( 'Cindy', '6/4/2014','Distributor')
INSERT #tmp
VALUES  ( 'John', '5/8/2014','Direct')
INSERT #tmp
VALUES  ( 'John', '2/14/2014','Distributor')


; WITH CTE_RESULT AS
(
    SELECT ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY ORDERDATE ASC) ROW_NO , Name, orderdate, OrderType
    FROM #tmp
)

SELECT  * FROM CTE_RESULT T WHERE T.ROW_NO=1

嘗試這個

select 
a.name, 
MIN(a.date)as date, 


from dbname a i
inner join (select name, min(date), ordertype from dbname) b on b.name=a.name and a.date=b.date

group by a.name, b.ordertype 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM