programing

MySQL 모든 스토어에 대한 최신 엔트리 가져오기

mailnote 2023. 10. 18. 22:59
반응형

MySQL 모든 스토어에 대한 최신 엔트리 가져오기

15분 단위로 누적 판매액을 기록한 표에서 최신 행을 구하려고 합니다.

테이블의 기본 레이아웃은

StoreID, Time, Sales, Tax, Date

각 매장 ID에 대한 최신 기록을 반품할 수 있으면 좋겠습니다.지금까지 시도해 본 질문은 다음과 같습니다.

SELECT t.StoreID, MAX(t.Time) as 'Last Reported', t.Sales+t.Tax as Sales, t.Date FROM ( SELECT * FROM trickledata WHERE Date = '20180724' ) t GROUP BY t.StoreID;

이것은 효과가 있지만, 당분간은 그에 상응하는 매출을 돌려주지는 않습니다.예.

+---------+---------------+-------+------------+ | StoreID | Last Reported | Sales | Date | +---------+---------------+-------+------------+ | 100 | 11:45:00 | 0.00 | 2018-07-24 | | 111 | 12:00:00 | 0.00 | 2018-07-24 | | 115 | 12:00:00 | 0.00 | 2018-07-24 | | 121 | 12:00:00 | 0.00 | 2018-07-24 | | 122 | 12:00:00 | 0.00 | 2018-07-24 | | 123 | 12:00:00 | 0.00 | 2018-07-24 | | 124 | 12:00:00 | 0.00 | 2018-07-24 | | 125 | 12:00:00 | 0.00 | 2018-07-24 | | 126 | 12:00:00 | 0.00 | 2018-07-24 | | 127 | 12:00:00 | 0.00 | 2018-07-24 | | 128 | 12:00:00 | 0.00 | 2018-07-24 | | 129 | 12:00:00 | 0.00 | 2018-07-24 | | 130 | 12:00:00 | 0.00 | 2018-07-24 | | 131 | 12:00:00 | 0.00 | 2018-07-24 | | 135 | 12:00:00 | 0.00 | 2018-07-24 | | 137 | 12:00:00 | 0.00 | 2018-07-24 | | 138 | 12:00:00 | 0.00 | 2018-07-24 | | 141 | 12:00:00 | 0.00 | 2018-07-24 | | 150 | 12:00:00 | 0.00 | 2018-07-24 | | 160 | 12:00:00 | 0.00 | 2018-07-24 | | 164 | 12:00:00 | 0.00 | 2018-07-24 |

하지만 그 때는 판매가 있었습니다. 121호점에 대한 특정 날짜와 시간을 문의하면 다음과 같은 답변을 받을 수 있기 때문입니다.

+---------+------------+----------+-------+------+ | StoreID | Date | Time | Sales | Tax | +---------+------------+----------+-------+------+ | 121 | 2018-07-24 | 12:00:00 | 65.79 | 4.55 | +---------+------------+----------+-------+------+

CREATE TABLE 문:

``CREATE TABLE `trickledata` (
    `StoreID` INT(11) NULL DEFAULT NULL,
    `Date` DATE NULL DEFAULT NULL,
    `Time` TIME NULL DEFAULT NULL,
    `Sales` DECIMAL(10,2) NULL DEFAULT NULL,
    `Tax` DECIMAL(10,2) NULL DEFAULT NULL,
    UNIQUE INDEX `Date` (`Date`, `Time`, `StoreID`),
    INDEX `by_date` (`Date`),
    INDEX `by_store` (`StoreID`)
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;
``

샘플 데이터:INSERT LOW_PRIORITY IGNORE INTO `trickle`.`trickledata_copy` (`StoreID`, `Date`, `Time`, `Sales`, `Tax`) VALUES ('0100', '20180724', '120000', '212.63', '15.37'), ('0100', '20180724', '114500', '212.63', '15.37'), ('0100', '20180724', '113000', '212.63', '15.37'), ('0100', '20180724', '111500', '212.63', '15.37'), ('0100', '20180724', '110000', '212.63', '15.37'), ('0100', '20180724', '104500', '212.63', '15.37'), ('0100', '20180724', '103000', '212.63', '15.37'), ('0100', '20180724', '101500', '.00', '.00'), ('0100', '20180724', '100000', '.00', '.00'), ('0100', '20180724', '94500', '.00', '.00'), ('0100', '20180724', '93000', '.00', '.00'), ('0100', '20180724', '91500', '.00', '.00'), ('0100', '20180724', '90000', '.00', '.00'), ('0100', '20180724', '84500', '.00', '.00'), ('0100', '20180724', '83000', '.00', '.00'), ('0100', '20180724', '81500', '.00', '.00'), ('0100', '20180724', '80000', '.00', '.00'), ('0100', '20180724', '74500', '.00', '.00'), ('0100', '20180723', '253000', '986.07', '71.44'), ('0100', '20180723', '251500', '986.07', '71.44'), ('0100', '20180723', '250000', '986.07', '71.44'), ('0100', '20180723', '244500', '986.07', '71.44'), ('0100', '20180723', '243000', '986.07', '71.44'), ('0100', '20180723', '241500', '986.07', '71.44'), ('0100', '20180723', '240000', '986.07', '71.44'), ('0100', '20180723', '234500', '986.07', '71.44'), ('0100', '20180723', '233000', '986.07', '71.44'), ('0100', '20180723', '231500', '986.07', '71.44'), ('0100', '20180723', '230000', '986.07', '71.44'), ('0100', '20180723', '224500', '986.07', '71.44'), ('0100', '20180723', '223000', '986.07', '71.44'), ('0100', '20180723', '221500', '986.07', '71.44'), ('0100', '20180723', '220000', '986.07', '71.44'), ('0100', '20180723', '214500', '986.07', '71.44'), ('0100', '20180723', '213000', '986.07', '71.44'), ('0100', '20180723', '120000', '986.07', '71.44'), ('0100', '20180723', '210000', '986.07', '71.44'), ('0100', '20180723', '204500', '986.07', '71.44');

편집 #2: 해당 샘플 데이터를 사용하고 쿼리를 실행하면 0.00 버그가 생성됩니다.하지만 달리기SELECT * FROM trickledata WHERE Time = '120000$212.63의 결과를 가져옵니다.

또한 나의 MariaDB 버전은 10.1.29 입니다.

편집 #3: 다음을 시도했습니다.

''SELECT t.* FROM trickledata t
    -> JOIN (
    -> SELECT StoreID, MAX(Time) AS latest, Sales, Date
    -> FROM trickledata
    -> WHERE Date = '20180724'
    -> GROUP BY StoreID
    -> ) m ON t.StoreID = m.StoreID AND t.Time = m.latest;''

하지만, 그것은 제가 가진 모든 날짜가 정오에 돌아옵니다.나는 단지 오늘의 데이터를 원합니다.

편집 #4: 유니크 인덱스를 삭제하면 초기 쿼리가 예상대로 작동한다는 것을 알았습니다.그런데 왜 그런지 이해가 안 되네요.또한 csv 파일에서 정보를 읽는 것이기 때문에 중복되는 것을 방지하기 위해 고유한 인덱스가 필요합니다.

하루와 저장에 대한 최대 시간을 얻을 수 있는 상관된 하위 쿼리를 사용하여 시간을 필터링합니다.

SELECT `t1`.`storeid` `StoreId`,
       `t1`.`time` `Last Reported`,
       `t1`.`sales` + `t1`.`tax` `Sales`,
       `t1`.`date` `Date`
       FROM `trickledata` `t1`
       WHERE `t1`.`date` = '2018-07-24'
             AND `t1`.`time` = (SELECT max(`t2`.`time`)
                                       FROM `trickledata` `t2`
                                       WHERE `t2`.`storeid` = `t1`.`storeid`
                                             AND `t2`.`date` = `t1`.`date`);

중복(동일한 스토어에 대해 동일한 시간에 대해 두 개 이상의 보고서)이 있는 경우 표시됩니다.이를 제외하려면 리포트에 추가 순서를 정의해야 하는 다른 기준을 정의해야 합니다.

언급URL : https://stackoverflow.com/questions/51503453/mysql-get-latest-entry-for-all-stores

반응형