Использование подстроки значения данных в моем запросе SQL - PullRequest
0 голосов
/ 22 декабря 2010

В моей базе данных есть данные, которые выглядят следующим образом:

Date (DateTime)        Type (varchar)  Data (varchar)
2010/12/22 6:00        Geofence        Area 1,1
2010/12/22 7:00        Geofence        Area 1,0
2010/12/22 7:30        Geofence        Area 2,1
2010/12/22 7:45        Geofence        Area 2,0
2010/12/22 8:00        Geofence        Area 3,1

Как видно, для типа данных Geofence данные разделяются запятой, причем первая половина содержит имягеозона и вторая половина, указывающие, вошла ли точка в геозону или нет.

Я пытаюсь получить список всех последних записей типа геозоны для каждой области.Мой идеальный вывод будет выглядеть так:

Date                   Type       Data
2010/12/22 7:00        Geofence   Area 1,0
2010/12/22 7:45        Geofence   Area 2,0
2010/12/22 8:00        Geofence   Area 3,1

Мой гипотетический оператор SQL будет выглядеть следующим образом

SELECT MAX(Date) AS LatestDate, Data
FROM MyTable
WHERE Type = 'Geofence'
GROUP BY FirstHalfOf(Data)

Возможно ли сделать это, сохранив такую ​​же структуру таблицы?

Я использую MS SQL Server 2008

Спасибо

PS В соответствии с запросом приведен код SQL для создания таблицы и заполнения ее примерами данных:

CREATE TABLE TestData (
    id int PRIMARY KEY IDENTITY,
    Date datetime NOT NULL,
    Type varchar(50) NOT NULL,
    Data varchar(max) NULL)

INSERT INTO TestData (Date, Type, Data)
VALUES('2010/12/22 6:00', 'Geofence', 'Area 1,1')
INSERT INTO TestData (Date, Type, Data)
VALUES('2010/12/22 7:00', 'Geofence', 'Area 1,0')
INSERT INTO TestData (Date, Type, Data)
VALUES('2010/12/22 7:30', 'Geofence', 'Area 2,1')
INSERT INTO TestData (Date, Type, Data)
VALUES('2010/12/22 7:45', 'Geofence', 'Area 2,0')
INSERT INTO TestData (Date, Type, Data)
VALUES('2010/12/22 8:00', 'Geofence', 'Area 3,1')

Ответы [ 2 ]

1 голос
/ 22 декабря 2010

Вот решение для MS SQL Server

;WITH cte
          AS (
              SELECT    id,
                        Date,
                        Type,
                        Data,
                        SUBSTRING(Data, 1, CASE WHEN CHARINDEX(',', Data) = 0
                                           THEN LEN(Data)
                                           ELSE (CHARINDEX(',', Data) - 1)
                                           END) AS k
              FROM      TestData
             ),
        counts
          AS (
              SELECT    *,
                        duplicateCount = ROW_NUMBER() 
                        OVER (PARTITION BY k ORDER BY k, date desc)
              FROM      cte
             )
    SELECT  *
    FROM    counts
    WHERE   duplicateCount = 1
1 голос
/ 22 декабря 2010

Это для MySQL, функция подстроки зависит от платформы:

select m.Date, m.Type, m.Data
from MyTable m
inner join (
    SELECT SUBSTRING_INDEX(Data, ',', 1) as LeftData, 
        MAX(Date) AS LatestDate
    FROM MyTable 
    WHERE Type = 'Geofence' 
    GROUP BY SUBSTRING_INDEX(Data, ',', 1)
) mm on m.Date = mm.LatestDate
    and SUBSTRING_INDEX(m.Data, ',', 1) = mm.LeftData
...