Как группировать, находить минимальные и подсчитывать количество сгруппированных записей - PullRequest
0 голосов
/ 28 марта 2012

У меня есть таблица, состоящая из этих полей:

id  |   date_from  | date_to      |   price   |  status
----------------------------------------------------------
CK1     22-12-2012   29-12-2012       800         1
CK1     22-12-2012   29-12-2012       1200        1
CK2     24-12-2012   30-12-2012       1400        0
CK2     24-12-2012   30-12-2012       1800        1
CK2     24-12-2012   30-12-2012       2200        1

Как создать SQL, выбрать, который группирует результаты по ID, DATE_FROM, DATE_TO и выбирает наименьшее значение из цены, где status == 1, а также для подсчетаколичество сгруппированных записей?

Таким образом, результат будет

id    | date_from   | date_to      |   price   |  count
CK1     22-12-2012    29-12-2012       800        2
CK2     24-12-2012    30-12-2012       1800       2

И, возможно, есть ли способ узнать, сколько записей не было сгруппировано из-за статуса == 0?Это не очень важно, мне просто интересно, есть ли способ узнать количество бесчисленных записей для группы записей.

Ответы [ 3 ]

2 голосов
/ 28 марта 2012

Ваше описание не соответствует желаемому результату.

Это будет соответствовать вашему описанию, т.е. даст вам самую низкую цену, где статус равен 1, и подсчитает количество записей в группе:

select id, date_from, date_to, min(case status when 1 then price end) as price, count(*) as count
from TheTable
group by id, date_from, date_to

Результат:

id    | date_from   | date_to      |   price   |  count
CK1     22-12-2012    29-12-2012       800        2
CK2     24-12-2012    30-12-2012       1800       3

Это даст вам запрошенный результат, то есть отфильтрует записи, для которых статус равен 1, получит самую низкую цену и после фильтрации отфильтрует количество записей в группах:

select id, date_from, date_to, min(price) as price, count(*) as count
from TheTable
where status = 1
group by id, date_from, date_to

Результат:

id    | date_from   | date_to      |   price   |  count
CK1     22-12-2012    29-12-2012       800        2
CK2     24-12-2012    30-12-2012       1800       2

Чтобы получить количество записей, для которых статус равен 0, вам необходимо использовать первый метод, при котором вы не отфильтровываете эти записи. Если статус может быть только 0 или 1, вы можете просто использовать sum(status), чтобы получить количество записей, где статус равен 1, и count(case status when 0 then 1 end) или sum(1 - status), чтобы получить количество записей, где статус равен 0.

0 голосов
/ 28 марта 2012

Может быть что-то вроде этого:

данные испытаний

DECLARE @tbl TABLE
(
    id VARCHAR(100),
    date_from VARCHAR(100),
    date_to VARCHAR(100),
    price INT,
    status INT
)

INSERT INTO @tbl
VALUES
    ('CK1','22-12-2012','29-12-2012',800,1),
    ('CK1','22-12-2012','29-12-2012',1200,1),
    ('CK2','22-12-2012','29-12-2012',1400,0),
    ('CK2','22-12-2012','29-12-2012',1800,1),
    ('CK2','22-12-2012','29-12-2012',2200,1)

Запрос

;WITH CTE
AS
(
    SELECT
        ROW_NUMBER() OVER(PARTITION BY tbl.id ORDER BY tbl.price ASC) AS RowNbr,
        SUM(status) OVER(PARTITION BY tbl.id) AS [count],
        tbl.*
    FROM
        @tbl AS tbl
    WHERE
        status=1
)
SELECT
    CTE.id,
    CTE.date_from,
    CTE.date_to,
    CTE.price,
    CTE.[count]
FROM
    CTE
WHERE
    CTE.RowNbr=1
0 голосов
/ 28 марта 2012

Что-то вроде этого должно сработать:

select ID, DATE_FROM, DATE_TO, MIN(price), COUNT(*) from my_table where satus = 1 group by ID, DATE_FROM, DATE_TO

Одно замечание: нормально ли, что поле идентификатора может иметь одинаковое значение?" и другое на devguru

...