Максимальная дата последнего ввода данных, который подпадает под условие где - PullRequest
0 голосов
/ 22 октября 2019

У меня есть одна таблица, table1

cust_id     Date            Value
1           2019-10-01      25
1           2019-10-19      35
1           2018-08-27      29
1           2019-07-09      35
1           2019-10-15      55
2           2019-09-26      45
2           2019-06-19      31
2           2019-07-19      8

Я написал запрос:

select 
 t1.value, 
 max(t1.date) as max_date
 from table1 t1
  where   
   t1.cust_id = '1'
   and (t1.date >= '2019-09-30 and t1.date <= 2019-10-31)
   and t1.value > 25
group by t1.value

, но он дает мне:

cust_id     max_date            Value
1           10/1/2019           25
1           10/19/2019          35
1           10/15/2019          55

Хотелось быпросто получить:

Последняя запись даты, значение которой превышает 25.

cust_id     max_date          Value
1           10/19/2019        35

Ответы [ 3 ]

1 голос
/ 22 октября 2019

Вам нужно найти максимальную дату для каждого клиента, где значение больше 25, и объединить всю таблицу, чтобы получить другие значения. Как это ...

DROP TABLE IF EXISTS #table1;
CREATE TABLE #table1
(
    cust_id INTEGER NOT NULL
  , Date DATE NOT NULL
  , Value INTEGER NOT NULL
);
INSERT INTO #table1
(
    cust_id
  , Date
  , Value
)
VALUES
(1, '10/1/2019', 25)
, (1, '10/19/2019', 35)
, (1, '8/27/2019', 29)
, (1, '7/9/2019', 35)
, (1, '10/15/2019', 55)
, (2, '9/26/2019', 45)
, (2, '6/19/2019', 31)
, (2, '7/19/2019', 8);

SELECT     t1.*
FROM       #table1 AS t1
INNER JOIN (
               SELECT   cust_id
                      , MAX(Date) AS max_date
               FROM     #table1
               WHERE    Value > 25
               GROUP BY cust_id
           )       AS x ON t1.cust_id = x.cust_id
                           AND t1.Date = x.max_date;
0 голосов
/ 22 октября 2019

Предполагая, что для вашего столбца «Дата» задано значение «Дата», а не «Varchar / String», а «Cust_ID» и «Значение» - как целое число, я бы сделал следующее:

WITH CTE AS
(
  SELECT RN = ROW_NUMBER() OVER(ORDER BY t1.Custdate DESC), Cust_id, CustDate, Value 
  FROM table1 t1
  WHERE (t1.Custdate >= '09/30/2019' and t1.Custdate <= '10/30/2019')
  Group by CustDate, Cust_id, Value
)
SELECT * FROM CTE WHERE RN = 1;

В этом запросе предполагается, что вы используете SQL 2005или новее. Вот SQL Fiddle для справки. Я также думаю, что это позаботится и о дубликатах, но требует тестирования.

http://sqlfiddle.com/#!18/a7ce8/44

0 голосов
/ 22 октября 2019

Предполагается, что нет повторяющихся дат. Вы должны выбрать строку, в которой дата = максимальная дата, соответствующая вашим критериям:

select cust_id, value, date as max_date
from table1
where date = (select max(date)
              from table1
              where cust_id = '1'
                 and date >= '2019-09-30'
                 and date <= '2019-10-31'
                 and value > 25
             )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...