[英]SQL: How To Find The Top String Column Value in a Grouped Query
當進行分組時,有一種簡單的方法可以從列中獲取第一個值或最高值。 在下面的示例中,如果按[日期]降序排序,我希望[文本]中的最后一個值。
SELECT
[Id],
MAX([Date]),
TOP 1 [Text], <-- How do I do do this
COUNT(*)
FROM
[ExampleTable]
GROUP BY [Id]
ORDER BY [Date] DESC
提前致謝。
如果您想要與[Id]和[MaxDate]相對應的文本,則可以執行以下操作:
SELECT T2.*, T1.Text
FROM [ExampleTable] T1
JOIN (SELECT
[Id],
MAX([Date]) MaxDate,
COUNT(*) Cnt
FROM
[ExampleTable]
GROUP BY [Id]) T2
ON T1.Id = T2.Id AND T1.Date = T2.MaxDate
ORDER BY [Date] DESC
如果[Id]和[Date]構成主鍵,則每個(Id,Date)都會有一個單行,否則很多。 如果您真的想要一個,則可以放置其他約束,也可以使用MAX或MIN ::
SELECT T2.*, MAX(T1.Text) Text -- or MIN(T1.Text)
FROM [ExampleTable] T1
JOIN (SELECT
[Id],
MAX([Date]) MaxDate,
COUNT(*) Cnt
FROM
[ExampleTable]
GROUP BY [Id]) T2
ON T1.Id = T2.Id AND T1.Date = T2.MaxDate
GROUP BY T2.*
ORDER BY [Date] DESC
如果只需要一個Text值,則可以使用MAX或MIN:
SELECT
[Id],
MAX([Date]),
MAX([Text]),
COUNT(*)
FROM
[ExampleTable]
GROUP BY [Id]
ORDER BY [Date] DESC
如果我正確理解您的意見,則任何給定ID可能有多個日期,給定日期可能有多個文本。
如果使用Sql Server 2005
我有這個工作
DECLARE @Table TABLE(
ID INT,
DDATE DATETIME,
VAL VARCHAR(MAX)
)
INSERT INTO @Table (ID,DDATE,VAL) SELECT 1, '01 Jan 2009', '1'
INSERT INTO @Table (ID,DDATE,VAL) SELECT 1, '01 Feb 2009', '2'
INSERT INTO @Table (ID,DDATE,VAL) SELECT 1, '01 Feb 2009', '3'
INSERT INTO @Table (ID,DDATE,VAL) SELECT 2, '01 Jan 2009', '4'
SELECT ID,
DDATE,
VAL,
ROWNUMBER
FROM (
SELECT t.ID,
t.DDATE,
t.VAL,
ROW_NUMBER() OVER (PARTITION BY t.ID ORDER BY DDATE) ROWNUMBER
FROM @Table t INNER JOIN
(
SELECT ID,
MAX(DDATE) AS MAXDATE
FROM @Table
GROUP BY ID
) md ON t.ID = md.ID
AND t.DDATE = md.MAXDATE
) RowNumber
WHERE RowNumber.ROWNUMBER = 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.