sql подзапрос сгруппировать по - PullRequest
2 голосов
/ 16 декабря 2011

Мне нужна помощь с запросом SQL: данные выглядят так:

ID (int, PK)
REF (int, FK)
UserName (varchar)
TransDate (DateTime)
Status (int)

1, 1001, joebloggs, 2011-12-15 13:50:01, 1
2, 1001, johnsmith, 2011-12-15 14:35:01, 1

, поэтому мне нужно вернуть REF и имя пользователя для следующего;MIN (TransDate) и где status = 1.

, поэтому я делаю следующее:

    SELECT  REF, UserName, MIN(TransDate )
    FROM          dbo.MyTable
    WHERE      (Status = 1)
    and REF = 1001
    GROUP BY REF, UserName

очевидно, что это неправильно, потому что возвращает меня:

1001, joebloggs, 2011-12-15 13:50:01
1001, johnsmith, 2011-12-15 14:35:01

однакоМне просто нужно вернуть имя пользователя min transDate.итак:

1001, joebloggs, 2011-12-15 13:50:01

может кто-нибудь помочь мне, пожалуйста .. это сводит меня с ума.

спасибо (от моего здравомыслия)

Ответы [ 5 ]

3 голосов
/ 16 декабря 2011
SELECT REF, UserName, TransDate
FROM dbo.MyTable    
WHERE ID = (
    SELECT TOP 1 ID
    FROM dbo.MyTable
    WHERE Status = 1 AND REF = 1001
    ORDER BY TransDate ASC
)

EDIT:

Или, если вам нужны результаты для каждого REF, вместо конкретного REF, вы можете попробовать это:

SELECT mt.REF, mt.UserName, mt.TransDate
FROM 
    dbo.MyTable mt JOIN (
        SELECT
            REF,
            MIN(TransDate) AS MinTransDate
        FROM dbo.MyTable
        WHERE Status = 1
        GROUP BY REF
    ) MinResult mr ON mr.REF = mt.REF AND mr.MinTransDate = mt.TransDate
2 голосов
/ 16 декабря 2011

Как насчет этого?

SELECT TOP(1) REF, UserName, TransDate
FROM dbo.MyTable
WHERE (Status = 1)
and REF = 1001
ORDER BY TransDate
0 голосов
/ 16 декабря 2011

Почти нет. Используйте подзапрос, чтобы найти min_date, а затем присоединитесь к исходной таблице для остальных данных.

select * from dbo.mytable
inner join (select min(transdate)
FROM          dbo.MyTable
WHERE      (Status = 1)
and REF = 1001) a
on mytable.transdate = a.transdate

Это решение будет возвращать несколько строк, если у вас есть несколько записей с одинаковым trans_date

0 голосов
/ 16 декабря 2011

Попробуйте

SELECT  REF, UserName, MIN(TransDate )
FROM          dbo.MyTable
WHERE      (Status = 1)
and REF = 1001
and transdate=(select min(transdate) from dbo.MyTable)
GROUP BY REF, UserName;
0 голосов
/ 16 декабря 2011

Добавьте order by и Limit 1:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...