Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как вывести значение поля по минимальной дате с группировкой по другому полю  [new]
lika01
Member

Откуда:
Сообщений: 4
Доброго времени суток!
Помогите, пжл, начинающему

есть результат запроса:
id num
1 0
2 1
3 1

Есть таблица
table2
id dt_open c_code
1 01.02.2007 432-654
1 11.12.2017 676-865
1 05.10.2018 454-456
2 01.02.2007 234-566
2 05.10.2018 852-543
3 05.10.2018 759-252
3 11.12.2017 686-876

К результату запроса необходимо вытащить значение поля c_code из table2 по минимальной дате, с группировкой по id, если поле num=1. Если num=0, то null.
т.е. должен быть результат:
id num c_code
1 0
2 1 234-566
3 1 686-876
19 дек 18, 20:15    [21768849]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести значение поля по минимальной дате с группировкой по другому полю  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
lika01,

Группировка второй таблицы с max датой
Потом джойните результат с первой выборкой по id
Потом определяетесь нужен ли вам null или 0 и делаете case соответственно.
19 дек 18, 21:27    [21768914]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести значение поля по минимальной дате с группировкой по другому полю  [new]
londinium
Member

Откуда: Киев
Сообщений: 1136
lika01,
как-то так
WITH RESULTQUERY(ID,NUM)
AS
(
  SELECT 1 AS ID,0 AS NUM
   UNION ALL
  SELECT 2 AS ID,1 AS NUM
   UNION ALL
  SELECT 3 AS ID,1 AS NUM  
),
TABLE2(ID,DT_OPEN,C_CODE)AS
(
  SELECT 1,'20070201','432-654'
   UNION ALL
  SELECT 1,'20171211','676-865' 
   UNION ALL
  SELECT 1,'20181005','454-456' 
   UNION ALL
  SELECT 2,'20070201','234-566' 
   UNION ALL
  SELECT 2,'20180510','852-543' 
   UNION ALL
  SELECT 3,'20171211','686-876' 
   UNION ALL
  SELECT 3,'20180510','759-252' 
)
SELECT R.ID,R.NUM,
CASE 
 WHEN R.NUM=0 THEN NULL 
 ELSE XQUERY.C_CODE
END AS FL 
 FROM RESULTQUERY R
 JOIN
 (
   SELECT T.ID,T.DT_OPEN,T.C_CODE
    FROM TABLE2 T
    JOIN
    (
      SELECT ID,MIN(DT_OPEN)MINDT
       FROM TABLE2
       GROUP BY ID
    )MINQ ON T.ID=MINQ.ID AND T.DT_OPEN=MINQ.MINDT
 )XQUERY ON R.ID=XQUERY.ID
19 дек 18, 21:41    [21768924]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести значение поля по минимальной дате с группировкой по другому полю  [new]
lika01
Member

Откуда:
Сообщений: 4
londinium, Спасибо.

В предложенном варианте решения идет перечисление значений таблицы, а у меня строк десятки тысяч (данные даны для наглядности). Как быть?
20 дек 18, 05:11    [21769067]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести значение поля по минимальной дате с группировкой по другому полю  [new]
lika01
Member

Откуда:
Сообщений: 4
PizzaPizza, спасибо

примерный план реализации в голове такой и был. Только синтаксис SQL мне еще не совсем подвластен (я только в самом начале пути), крутила этими функциями, но не получается, что-то видимо делаю не так.
Можете показать Ваш предложенный вариант на конкретном примере с построением самого запроса, очень буду благодарна))!
Уточню, что данных десятки тысяч строк (предоставленные мной данные, для примера).
20 дек 18, 05:18    [21769070]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести значение поля по минимальной дате с группировкой по другому полю  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
Вариант londinium как раз реализация этого плана.
Почитайте про CTE - подзапросы, что бы понять синтаксис. По сути каждый СТЕ (который начинается с WITH... AS и запрос в скобочках), это отдельный подзапрос, коорый вынесен для наглядности и к результату которого вы обращаетесь в дальнейшем.

londinium
lika01,
как-то так
WITH RESULTQUERY(ID,NUM)
AS
( -- тут ваш запрос, в котором вы получаете первую выборку
  SELECT 1 AS ID,0 AS NUM
   UNION ALL
  SELECT 2 AS ID,1 AS NUM
   UNION ALL
  SELECT 3 AS ID,1 AS NUM  
),
TABLE2(ID,DT_OPEN,C_CODE)AS
( -- тут просто выборка из вашей таблицы TABLE2 (select ... from TABLE2 c нужными вам условиями)
  SELECT 1,'20070201','432-654'
   UNION ALL
  SELECT 1,'20171211','676-865' 
   UNION ALL
  SELECT 1,'20181005','454-456' 
   UNION ALL
  SELECT 2,'20070201','234-566' 
   UNION ALL
  SELECT 2,'20180510','852-543' 
   UNION ALL
  SELECT 3,'20171211','686-876' 
   UNION ALL
  SELECT 3,'20180510','759-252' 
)
SELECT R.ID,R.NUM,
CASE  -- 3. условие, если результирующей выборке NUM = 0, то NULL, иначе выбирается само значение C_CODE
 WHEN R.NUM=0 THEN NULL 
 ELSE XQUERY.C_CODE
END AS FL 
 FROM RESULTQUERY R
 JOIN -- 2. джойн первой выборки с результатом группировки
 (
   SELECT T.ID,T.DT_OPEN,T.C_CODE
    FROM TABLE2 T
    JOIN
    ( -- 1. группировка по ID с выборкой минимальной даты
      SELECT ID,MIN(DT_OPEN)MINDT
       FROM TABLE2
       GROUP BY ID
    )MINQ ON T.ID=MINQ.ID AND T.DT_OPEN=MINQ.MINDT
 )XQUERY ON R.ID=XQUERY.ID
20 дек 18, 06:05    [21769072]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести значение поля по минимальной дате с группировкой по другому полю  [new]
lika01
Member

Откуда:
Сообщений: 4
PizzaPizza,
Спасибо большое за разъяснения!
Извиняюсь, за свою не осведомленность в этой теме, обязательно почитаю)
20 дек 18, 06:18    [21769074]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести значение поля по минимальной дате с группировкой по другому полю  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20189
select distinct table1.id, 
                table1.num, 
                case when table1.num = 1 
                     then first_value(table2.c_code) over (partition by table2.id
                                                           order by table2.dt_open) 
                end c_code
from table1,table2
where table1.id = table2.id
order by 1
20 дек 18, 07:50    [21769101]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести значение поля по минимальной дате с группировкой по другому полю  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20189
fiddle
20 дек 18, 07:51    [21769102]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести значение поля по минимальной дате с группировкой по другому полю  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4378
Akina,

 WITH Table1(ID,NUM)
AS
( -- тут ваш запрос, в котором вы получаете первую выборку
  SELECT 1 AS ID,0 AS NUM
   UNION ALL
  SELECT 2 AS ID,1 AS NUM
   UNION ALL
  SELECT 3 AS ID,1 AS NUM  
),
TABLE2(ID,DT_OPEN,C_CODE)AS
( -- тут просто выборка из вашей таблицы TABLE2 (select ... from TABLE2 c нужными вам условиями)
  SELECT 1,'20070201','432-654'
   UNION ALL
  SELECT 1,'20171211','676-865' 
   UNION ALL
  SELECT 1,'20181005','454-456' 
   UNION ALL
  SELECT 2,'20070201','234-566' 
   UNION ALL
  SELECT 2,'20180510','852-543' 
   UNION ALL
  SELECT 3,'20171211','686-876' 
   UNION ALL
  SELECT 3,'20180510','759-252' 
)

SELECT * FROM 
(
	SELECT table1.id, NULL AS c_code, table1.num 
	from table1
	where table1.num = 0 

	UNION ALL 

	SELECT TOP 1 WITH TIES table1.id, table2.c_code, table1.num 
	from table1, table2
	where table1.id = table2.id AND table1.num = 1 
	ORDER BY ROW_NUMBER() OVER (partition by table2.id order by table2.dt_open) 
) A
20 дек 18, 12:05    [21769327]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить