2017-02-14 12 views
1

Как считать последний логин для каждого пользователя в день.?подсчитывает последний логин для каждого пользователя в день

Таблица похож на этот

id name Date 
----------------- 
1 a 01-Feb-2017 
2 a 01-Feb-2017 
3 a 01-Feb-2017 
4 b 02-Feb-2017 
5 b 02-Feb-2017 
6 c 04-Feb-2017 
7 c 04-Feb-2017 
  1. Все, что я хочу сделать, это положить to_char (дата, 'дд-мм-гггг-чч-мм-сс) до даты, как моя дата не есть времена в нем.
  2. Получить последний логин для пользователя a на 1-feb-2017, пользователь b на 2-feb-2017 и пользователь c on 4-feb-2017
  3. Один пользователь может войти в систему несколько раз, поэтому даты печатаются многими раз, но я хочу показать только дату последнего входа.

Пожалуйста, дайте мне знать, пожалуйста ..... выглядит простой, но я застрял

+0

В некоторых (большинство) случае, это может быть сделано с помощью 'GROUP BY' и используя' MAX (дата) '(зависит от СУБД) – AxelH

+0

Какие dbms вы используете? (Многие продукты далеки от соответствия ANSI SQL, когда дело доходит до даты/времени.) – jarlh

+0

Типы данных столбцов? – jarlh

ответ

2

Как считать последний логин для каждого пользователя в день.?

Group результаты пользователя (т.е. name) и каждый день (т.е. TRUNC("Date")), а затем, чтобы получить последнее значение в каждой группе вы можете взять максимум:

SELECT name, MAX("Date") 
FROM your_table 
GROUP BY name, TRUNC("Date") 

моя дата не есть времена в нем.

Да, они делают. SQL Developer просто не показывает его.

Либо, измените параметр NLS_DATE_FORMAT - как показано в this answer.

или alter the oracle session parameter.

Или формат вывода в виде строки:

SELECT name, 
     TO_CHAR(MAX("Date"), 'YYYY-MM-DD HH24:MI:SS') AS last_date 
FROM your_table 
GROUP BY name, TRUNC("Date") 
+0

Работает отлично. Спасибо alot :) – Codework

0

Попробуйте это:

SELECT name, MAX(TO_DATE("Date", 'DD-MM-YYYY')) last_date 
FROM 
(
    SELECT 1 AS id, 'a' AS name, '01-Feb-2017' AS "Date" 
     FROM dual UNION 
    SELECT 2, 'a', '01-Feb-2017' 
     FROM dual UNION 
    SELECT 3, 'a', '01-Feb-2017' 
     FROM dual UNION 
    SELECT 4, 'b', '02-Feb-2017' 
     FROM dual union 
    SELECT 5, 'b', '02-Feb-2017' 
     FROM dual UNION 
    SELECT 6, 'c', '04-Feb-2017' 
     FROM dual UNION 
    SELECT 7, 'c', '04-Feb-2017' 
     FROM dual 
) mytable 
GROUP BY name 

Выход:

NAME LAST_DATE 
1 a 01.02.2017 00:00:00 
2 c 04.02.2017 00:00:00 
3 b 02.02.2017 00:00:00 

Объяснение:

Вы группируете свой результат по имени, вы хотите получить последнюю дату, таким образом макс (дата). Но у вас есть строка в качестве даты. Итак, сначала вы конвертируете его в datetime.

Если вы хотите получить другой выход, вы можете предоставить его нам ... потому что сейчас это неясно.

+0

Из [документации Oracle] (https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions027.htm#SQLRF00620): 'CONVERT' преобразует строку символов из одного набора символов в другой. Это не похоже на ответ Oracle. Вероятно, вы хотите использовать функцию «TRUNC». – MT0

+0

мой плохой.в первом опубликовании сообщения тег был sql-сервером или, по крайней мере, он считал, что это – devoh

+0

Тег [sql] означает язык SQL и не является короткой рукой для MS SQL Server (хотя некоторые плакаты действительно используют его как таковой). – APC

 Смежные вопросы

  • Нет связанных вопросов^_^