powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как получить одну запись у которой минимальное значение в поле дата и время?
11 сообщений из 11, страница 1 из 1
Как получить одну запись у которой минимальное значение в поле дата и время?
    #40025501
Artlian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Данные выгружаю с базы данных по пропускной системе. Нужно получить одну запись у которой минимальное значение в поле дата и время. То есть это время первого входа сотрудника. Имеется две проходных и нужно получить запись его первого входа. По этому запросу получаю две записи с первым входом по каждой проходной.

[Orion].dbo.pList.ID = '245' - это ID сотрудника.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT DISTINCT TOP (100) PERCENT [Orion].dbo.pList.MidName, Orion.dbo.pList.FirstName, Orion.dbo.pList.Name, MAX(Orion.dbo.pLogData.TimeVal) AS DataTime, Orion.dbo.pLogData.Remark AS Department,[Orion].dbo.PDivision.Name AS Division
FROM [Orion].dbo.pList INNER JOIN
                         [Orion].dbo.PDivision ON [Orion].dbo.pList.Section = [Orion].dbo.PDivision.ID INNER JOIN
                         [Orion].dbo.pLogData ON [Orion].dbo.pList.ID = [Orion].dbo.pLogData.HozOrgan
                    WHERE(CONVERT(date, [Orion].dbo.pLogData.TimeVal) = '2020-12-07') AND (CONVERT(time, [Orion].dbo.pLogData.TimeVal) BETWEEN '05:00' AND '17:00') AND ([Orion].dbo.pLogData.Remark = '1: Вход   Проходная № 1,   Считыватель 1, Прибор 1' OR
                         [Orion].dbo.pLogData.Remark = '2: Вход   Проходная № 2,   Считыватель 1, Прибор 1') AND ([Orion].dbo.pList.ID = '245')
GROUP BY  [Orion].dbo.pList.MidName, [Orion].dbo.pList.FirstName, [Orion].dbo.pList.Name, [Orion].dbo.pLogData.Remark,[Orion].dbo.PDivision.Name, [Orion].dbo.pList.ID
ORDER BY  DataTime ASC



Когда делаю так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
[src]
SELECT DISTINCT TOP (1) PERCENT [Orion].dbo.pList.MidName, Orion.dbo.pList.FirstName, Orion.dbo.pList.Name, MAX(Orion.dbo.pLogData.TimeVal) AS DataTime, Orion.dbo.pLogData.Remark AS Department,[Orion].dbo.PDivision.Name AS Division
FROM [Orion].dbo.pList INNER JOIN
                         [Orion].dbo.PDivision ON [Orion].dbo.pList.Section = [Orion].dbo.PDivision.ID INNER JOIN
                         [Orion].dbo.pLogData ON [Orion].dbo.pList.ID = [Orion].dbo.pLogData.HozOrgan
                    WHERE(CONVERT(date, [Orion].dbo.pLogData.TimeVal) = '2020-12-07') AND (CONVERT(time, [Orion].dbo.pLogData.TimeVal) BETWEEN '05:00' AND '17:00') AND ([Orion].dbo.pLogData.Remark = '1: Вход   Проходная № 1,   Считыватель 1, Прибор 1' OR
                         [Orion].dbo.pLogData.Remark = '2: Вход   Проходная № 2,   Считыватель 1, Прибор 1') AND ([Orion].dbo.pList.ID = '245')
GROUP BY  [Orion].dbo.pList.MidName, [Orion].dbo.pList.FirstName, [Orion].dbo.pList.Name, [Orion].dbo.pLogData.Remark,[Orion].dbo.PDivision.Name, [Orion].dbo.pList.ID
ORDER BY  DataTime ASC



то вроде как все работает. И получаю одну запись.
Вопрос в том, верное ли это решение? Или может есть другое более верное решение?
[/SRC]
...
Рейтинг: 0 / 0
Как получить одну запись у которой минимальное значение в поле дата и время?
    #40025511
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем TOP (100) PERCENT?

что это за ужас:
WHERE(CONVERT(date, [Orion].dbo.pLogData.TimeVal) = '2020-12-07') AND (CONVERT(time, [Orion].dbo.pLogData.TimeVal) BETWEEN '05:00' AND '17:00')
переписать без CONVERT

Минимальное значение определяется с помощью MIN, а не MAX. В подзапросе определяете ключи такой записи, потом джойните это с основным набором данных.
...
Рейтинг: 0 / 0
Как получить одну запись у которой минимальное значение в поле дата и время?
    #40025517
Artlian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По MAX я опечатался. Если не использовать TOP (1) PERCENT то я получаю две записи. Если как Вы говорите TOP(1) PERCENT не нужен, подскажите как правильно?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT DISTINCT TOP (1) PERCENT [Orion].dbo.pList.MidName, Orion.dbo.pList.FirstName, Orion.dbo.pList.Name, MIN(Orion.dbo.pLogData.TimeVal) AS DataTime, Orion.dbo.pLogData.Remark AS Department,[Orion].dbo.PDivision.Name AS Division
FROM [Orion].dbo.pList INNER JOIN
                         [Orion].dbo.PDivision ON [Orion].dbo.pList.Section = [Orion].dbo.PDivision.ID INNER JOIN
                         [Orion].dbo.pLogData ON [Orion].dbo.pList.ID = [Orion].dbo.pLogData.HozOrgan
                    WHERE(CONVERT(date, [Orion].dbo.pLogData.TimeVal) = '2020-12-07') AND (CONVERT(time, [Orion].dbo.pLogData.TimeVal) BETWEEN '05:00' AND '17:00') AND ([Orion].dbo.pLogData.Remark = '1: Вход   Проходная № 1,   Считыватель 1, Прибор 1' OR
                         [Orion].dbo.pLogData.Remark = '2: Вход   Проходная № 2,   Считыватель 1, Прибор 1') AND ([Orion].dbo.pList.ID = '245')
GROUP BY  [Orion].dbo.pList.MidName, [Orion].dbo.pList.FirstName, [Orion].dbo.pList.Name, [Orion].dbo.pLogData.Remark,[Orion].dbo.PDivision.Name, [Orion].dbo.pList.ID
ORDER BY  DataTime ASC
...
Рейтинг: 0 / 0
Как получить одну запись у которой минимальное значение в поле дата и время?
    #40025522
Artlian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Критик, в этот ужас я потом в PHP подставлю другие значения.
...
Рейтинг: 0 / 0
Как получить одну запись у которой минимальное значение в поле дата и время?
    #40025528
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artlian
По MAX я опечатался.
А MIN зачем тут? И GROUP BY?

Artlian
Если не использовать TOP (1) PERCENT то я получаю две записи.
TOP (1) PERCENT - это отфильтровать один процент, то есть одну сотую, от общего количества записей.
Вам действительно нужен один процент, или нужна одна запись?

А DISTINCT зачем, потому что красиво?

Artlian
подскажите как правильно?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT TOP (1) [Orion].dbo.pList.MidName, Orion.dbo.pList.FirstName, Orion.dbo.pList.Name,
        Orion.dbo.pLogData.TimeVal AS DataTime, Orion.dbo.pLogData.Remark AS Department,
        [Orion].dbo.PDivision.Name AS Division
FROM [Orion].dbo.pList 
    INNER JOIN [Orion].dbo.PDivision ON [Orion].dbo.pList.Section = [Orion].dbo.PDivision.ID 
    INNER JOIN [Orion].dbo.pLogData ON [Orion].dbo.pList.ID = [Orion].dbo.pLogData.HozOrgan
WHERE(CONVERT(date, [Orion].dbo.pLogData.TimeVal) = '2020-12-07') 
    AND (CONVERT(time, [Orion].dbo.pLogData.TimeVal) BETWEEN '05:00' AND '17:00') 
    AND ([Orion].dbo.pLogData.Remark = '1: Вход   Проходная № 1,   Считыватель 1, Прибор 1' 
            OR
            [Orion].dbo.pLogData.Remark = '2: Вход   Проходная № 2,   Считыватель 1, Прибор 1') 
    AND ([Orion].dbo.pList.ID = '245')
ORDER BY Orion.dbo.pLogData.TimeVal ASC
...
Рейтинг: 0 / 0
Как получить одну запись у которой минимальное значение в поле дата и время?
    #40025577
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg

Artlian
подскажите как правильно?

Код: sql
1.
2.
3.
4.
WHERE(CONVERT(date, [Orion].dbo.pLogData.TimeVal) = '2020-12-07') 
    AND (CONVERT(time, [Orion].dbo.pLogData.TimeVal) BETWEEN '05:00' AND '17:00') 
    AND ([Orion].dbo.pLogData.Remark = '1: Вход   Проходная № 1,   Считыватель 1, Прибор 1' 
 



- Петька! Приборы!
- 200, Василий Иванович!
- Чего 200?
- А чего приборы?

ЗЫ. Нехорошо.
Учить детей плохому.
CONVERT(date, [Orion].dbo.pLogData.TimeVal)
...
Рейтинг: 0 / 0
Как получить одну запись у которой минимальное значение в поле дата и время?
    #40026031
Artlian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я видимо недостаточно точно объяснил. В общем есть две проходные, проходная 1 и проходная 2. Нужно получить записи через какую проходную каждый сотрудник прошел раньше.
В данном запросе у меня выводятся записи с первым входом через проходную 1 и первым входом через проходную 2. Мне же нужно получить записи только с по той проходной через которую сотрудник прошел раньше.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT  TOP (100)  [Orion].dbo.pList.Name,[Orion].dbo.pList.MidName, [Orion].dbo.pList.FirstName,  MIN([Orion].dbo.pLogData.TimeVal) AS DataTime, [Orion].dbo.pLogData.Remark AS Department,[Orion].dbo.PDivision.Name AS Division
FROM [Orion].dbo.pList INNER JOIN
                         [Orion].dbo.PDivision ON [Orion].dbo.pList.Section = [Orion].dbo.PDivision.ID INNER JOIN
                         [Orion].dbo.pLogData ON [Orion].dbo.pList.ID = [Orion].dbo.pLogData.HozOrgan
                    WHERE(CONVERT(date, [Orion].dbo.pLogData.TimeVal) = '2020-12-09') AND (CONVERT(time, [Orion].dbo.pLogData.TimeVal) BETWEEN '05:00' AND '17:00') AND 
                         ([Orion].dbo.pLogData.Remark = '1: Вход   Проходная № 1,   Считыватель 1, Прибор 1' OR [Orion].dbo.pLogData.Remark = '2: Вход   Проходная № 2,   Считыватель 1, Прибор 1') AND ([Orion].dbo.pList.ID IN ('1991','1901','103','1713','1929','2016','1940','1917','1226','1376','312','1695','245','1607','353','1957','10','1718','2015','776','2158','2212','2004','1841','1174','853','2012','939','536','562','1818','1416','35','1936','1140','1176','2006','308','1228','995','1419','649','1443','2009','804','2','2058','2014','2036','805','1371','1768','2005','1707','1243','33','197','1605','1374','523','1446','984','2001','315','1292','1439','1172','1337','1878','305','2008','1418'))
GROUP BY   [Orion].dbo.pList.Name,[Orion].dbo.pList.FirstName,[Orion].dbo.pList.MidName,  [Orion].dbo.pLogData.Remark,[Orion].dbo.PDivision.Name
ORDER BY  DataTime ASC
...
Рейтинг: 0 / 0
Как получить одну запись у которой минимальное значение в поле дата и время?
    #40026058
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with li as ( select * from [Orion].dbo.pList )
   , ld as ( select * 
                  , row_number() over( partition by HozOrgan order by TimeVal asc ) as n
               from [Orion].dbo.pLogData 
               where TimeVal BETWEEN '20201209T05:00' AND '20201209T17:00'
			         and Remark in ('1: Вход   Проходная № 1,   Считыватель 1, Прибор 1', '2: Вход   Проходная № 2,   Считыватель 1, Прибор 1')
					 and HozOrgan in (1991,1901,103,1713,1929,2016,1940,1917,1226,1376,312,1695,245,1607,353,1957,10,1718,2015,776,2158,2212,2004,1841,1174,853,2012,939,536,562,1818,1416,35,1936,1140,1176,2006,308,1228,995,1419,649,1443,2009,804,2,2058,2014,2036,805,1371,1768,2005,1707,1243,33,197,1605,1374,523,1446,984,2001,315,1292,1439,1172,1337,1878,305,2008,1418)
		   )
   , pd as ( select * from [Orion].dbo.PDivision )
   select li.Name, li.MidName, li.FirstName, ld.TimeVal AS DataTime, ld.Remark AS Department, pd.Name AS Division 
     from ld 
	      left outer join li on li.ID = ld.HozOrgan
	      left outer join pd on pd.ID = li.Section
	 where ld.n = 1
...
Рейтинг: 0 / 0
Как получить одну запись у которой минимальное значение в поле дата и время?
    #40026456
Artlian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222, Спасибо большое, все получилось 👍
...
Рейтинг: 0 / 0
Как получить одну запись у которой минимальное значение в поле дата и время?
    #40026462
Artlian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

Может быть вы сможете мне подсказать как и максимальное значение можно получить?
...
Рейтинг: 0 / 0
Как получить одну запись у которой минимальное значение в поле дата и время?
    #40026657
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artlian
aleks222,

Может быть вы сможете мне подсказать как и максимальное значение можно получить?


Точно также.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как получить одну запись у которой минимальное значение в поле дата и время?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]