Получить минимальную дату создания с несколькими строками - PullRequest
0 голосов
/ 23 марта 2019

У меня проблема с запросом SQL, который я пытаюсь написать.Я пытаюсь получить строку с минимальным значением create_dt для каждого экземпляра (см. Таблицу) и количеством (которое не является уникальным).

К сожалению, я не могу использовать group by в качестве amountстолбец не уникален.

+--------------+--------+------+-------------+
| Company_Name | Amount | inst | Create Date |
+--------------+--------+------+-------------+
| Company A    |   1000 | 4545 | 01/10/2018  |
| Company A    |    400 | 4545 | 01/11/2018  |
| Company A    |    200 | 4545 | 31/10/2018  |
| Company B    |   2000 | 4893 | 01/10/2016  |
| Company B    |    212 | 4893 | 04/10/2016  |
| Company B    |    100 | 4893 | 10/10/2017  |
| Company B    |     20 | 4893 | 04/10/2018  |
+--------------+--------+------+-------------+

В приведенном выше примере я ожидаю увидеть:

+--------------+--------+------+-------------+
| Company_Name | Amount | inst | Create Date |
+--------------+--------+------+-------------+
| Company A    |   1000 | 4545 | 01/10/2018  |
| Company B    |   2000 | 4893 | 01/10/2016  |
+--------------+--------+------+-------------+

Код:

SELECT 
    bill_company, bill_name, account_no 
FROM 
    dbo.customer_information;

SELECT 
    balance_id, balance_id2, minus_balance,new_balance,   
    create_date, account_no
FROM 
    dbo.btr

SELECT
    balance_id, balance_id2, expired_Date, amount, balance_type, account_no
FROM 
    dbo.btr_balance

SELECT 
    balance_ist, expired_date, account_no, balance_type
FROM 
    dbo.BALANCE_inst

Извлечь минимальные данные создания дляэкземпляр баланса с наименьшим балансом для экземпляра баланса.

(SELECT  
     bill_company,
     bill_name, 
     account_no, 
     balance_ist, 
     amount,
     MIN(create_date)
 FROM 
     dbo.mtr btr 
 LEFT JOIN
     btr_balance btrb ON btr.balance_id = btrb.balance_id 
                      AND btr.balance_id2 = btrb.balance_id2 
 LEFT JOIN 
     balance_inst bali ON btr.account_no = bali.account_no 
                       AND btrb.expired_date = bali.expired_date  
 GROUP BY 
     bill_company, bill_name, account_no,amount, balance_ist)

Я видел несколько решений об использовании коррелированного запроса, но не могу его обойти.

Ответы [ 2 ]

1 голос
/ 23 марта 2019

Common Table Expression (CTE) поможет вам.

;with cte as (
   select *, row_number() over(partition by company_name order by create_date) rn
   from dbo.myTable
)
select * from cte
where rn = 1;
0 голосов
/ 23 марта 2019

использовать row_number() я предположил bill_company название вашей компании

   select * from 
    ( SELECT  bill_company,
        bill_name, 
        account_no, 
        balance_ist, 
        amount,
        create_date,
        row_number() over(partition by bill_company order by create_date) rn
FROM dbo.mtr btr left join btr_balance btrb 
on btr.balance_id = btrb.balance_id and btr.balance_id2 = btrb.balance_id2 
 left join balance_inst bali 
on btr.account_no = bali.account_no and btrb.expired_date = bali.expired_date
) t where t.rn=1
...