날짜를 기준으로 볼륨 계산
막대 차트에 사용하고 싶은 MariaDB 테이블이 있습니다.
CREATE TABLE `payment_transaction_daily_facts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` date DEFAULT NULL,
`year` int(11) DEFAULT NULL,
`month` int(11) DEFAULT NULL,
`week` int(11) DEFAULT NULL,
`day` int(11) DEFAULT NULL,
`volume` int(11) DEFAULT NULL,
`count` int(11) DEFAULT NULL,
'created_at' date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
예를 들어 SQL 쿼리에서는 Date에 대한 단일 열이 있습니다.날짜, 연도, 월, 주, 일을 서로 다른 열로 나누었을 때 지난 10일 동안의 일별 볼륨을 계산하려면 어떻게 해야 합니까?
최종 결과는 다음과 같습니다.
Date | Amount| Number of transactions per day |
11-11-2018 | 30 | 3 |
11-12-2018 | 230 | 13 |
나는 이것을.
SELECT SUM(amount) AS sum_volume, COUNT(*) AS sum_Transactions
WHERE (created_at BETWEEN '2018-11-07' AND '2018-11-08')
GROUP BY DATE(created_at)
DTO를 사용하여 생성된 데이터를 반환합니다.
public class DashboardDTO {
private Date date;
private int sum_volume;
private int sum_Transactions;
... getters and setters
}
휴식 컨트롤러:
@RestController
@RequestMapping("/dashboard")
public class DashboardController {
private static final Logger LOG = LoggerFactory.getLogger(DashboardController.class);
@Autowired
private DashboardRepository dashboardRepository;
@Autowired
private PaymentTransactionsDailyFactsMapper mapper;
@GetMapping("/volumes")
public ResponseEntity<List<DashboardDTO>> getProcessingVolumes(@PathVariable String start_date, @PathVariable String end_date) {
List<DashboardDTO> list = StreamSupport.stream(dashboardRepository.findPaymentTransactionsDailyFacts(start_date, end_date).spliterator(), false)
.map(mapper::toDTO)
.collect(Collectors.toList());
return ResponseEntity.ok(list);
}
}
JPA 쿼리:
public List<PaymentTransactionsDailyFacts> findPaymentTransactionsDailyFacts(LocalDateTime start_date, LocalDateTime end_date) {
String hql = "SELECT SUM(amount) AS sum_volume, COUNT(*) AS sum_Transactions " +
" WHERE (created_at BETWEEN :start_date AND :end_date )" +
" GROUP BY DATE(created_at)";
TypedQuery<PaymentTransactionsDailyFacts> query = entityManager.createQuery(hql,
PaymentTransactionsDailyFacts.class).setParameter("start_date", start_date).setParameter("end_date", end_date);
List<PaymentTransactionsDailyFacts> data = query.getResultList();
return data;
}
쿼리를 제대로 구현하려면 어떻게 해야 합니까?
Angular에서 start_date 및 end_date를 String으로 받으면 LocaDateTime으로 변환하려면 어떻게 해야 합니까?
제가 언급했듯이, 시간은 데이터 웨어하우스 스타 스키마의 차원이며, 기간도 마찬가지라고 생각합니다.따라서 두 개의 차원 테이블이 있어야 합니다.TimeDim
Local Date의 경우, 그리고 a.PeriodDim
마침표를 찍습니다.그러면 당신은.Fact
스키마의 다양한 차원으로 구성된 embeddedId를 사용할 수 있습니다.그러면 1일 기간에 대한 사실과 10일 기간에 대한 사실이 있게 됩니다.만약 당신이 사실을 합산해야 한다고 주장했다면 당신은 JPA가 할 수 없는 문제를 가지고 있습니다.<=
아니면>=
컴포지트 키와 비교합니다.당신이 단지 10일을 합산하는 것이기 때문에 당신은 a를 사용할 수 있습니다.in
10개의 키를 선택할 수 있는 조항이지만, 필요한 기간에 대한 사실을 가지고 있어야 합니다.
@Entity
public class TimeDim {
@Id
private LocalDate localDate;
@Entity
public class PeriodDim {
@Id
private Period period;
// need this too
@Converter(autoApply = true)
public class LocalDateAttributeConverter implements AttributeConverter<LocalDate, Date> {
@Override
public Date convertToDatabaseColumn(LocalDate locDate) {
return (locDate == null ? null : Date.valueOf(locDate));
}
@Override
public LocalDate convertToEntityAttribute(Date sqlDate) {
return (sqlDate == null ? null : sqlDate.toLocalDate());
}
}
@SuppressWarnings("serial")
@Embeddable
public class DimKey implements Serializable {
private LocalDate localDate;
private Period period;
@Entity
public class Fact {
@EmbeddedId
private DimKey dimKey = new DimKey();
private long amount;
예를 들면 다음과 같습니다.
tx.begin();
TimeDim td10 = new TimeDim();
td10.setLocalDate(LocalDate.now().minusDays(5));
em.persist(td10);
TimeDim td5 = new TimeDim();
td5.setLocalDate(LocalDate.now().minusDays(10));
em.persist(td5);
PeriodDim pd5 = new PeriodDim();
pd5.setPeriod(Period.ofDays(5));
em.persist(pd5);
PeriodDim pd10 = new PeriodDim();
pd10.setPeriod(Period.ofDays(10));
em.persist(pd10);
Fact f10 = new Fact();
f10.getDimKey().setLocalDate(td10.getLocalDate());
f10.getDimKey().setPeriod(pd10.getPeriod());
f10.setAmount(100);
em.persist(f10);
Fact f51 = new Fact();
f51.getDimKey().setLocalDate(td10.getLocalDate());
f51.getDimKey().setPeriod(pd5.getPeriod());
f51.setAmount(50);
em.persist(f51);
Fact f52 = new Fact();
f52.getDimKey().setLocalDate(td5.getLocalDate());
f52.getDimKey().setPeriod(pd5.getPeriod());
f52.setAmount(50);
em.persist(f52);
tx.commit();
em.clear();
DimKey dk = new DimKey();
dk.setLocalDate(td10.getLocalDate());
dk.setPeriod(pd10.getPeriod());
Fact f = em.createQuery("select f from Fact f where f.dimKey = :dimKey", Fact.class)
.setParameter("dimKey", dk)
.getSingleResult();
System.out.println("From 10 day period: " + f.getAmount());
DimKey dk1 = new DimKey();
dk1.setLocalDate(td10.getLocalDate());
dk1.setPeriod(pd5.getPeriod());
DimKey dk2 = new DimKey();
dk2.setLocalDate(td5.getLocalDate());
dk2.setPeriod(pd5.getPeriod());
Long sum = em.createQuery("select sum(f.amount) from Fact f where f.dimKey in (:dimKey1 , :dimKey2)", Long.class)
.setParameter("dimKey1", dk1)
.setParameter("dimKey2", dk2)
.getSingleResult();
System.out.println("From 2*5 day period: " + sum);
언급URL : https://stackoverflow.com/questions/53197631/calculate-volumes-based-on-date
'source' 카테고리의 다른 글
WordPress 코딩 표준에 따라 VS Code에서 Intellephens를 설정할 수 있습니까? (0) | 2023.09.14 |
---|---|
삽입... 만들기Laravel에서 문 선택 (0) | 2023.09.14 |
여러 도메인 포인팅 루트 폴더는 web.config의 도메인 이름에 따라 하위 폴더를 포인팅해야 합니다. (0) | 2023.09.14 |
문자열 형식의 ORACLE RAW(오라클 RAW)에서 표준 GUID로 (0) | 2023.09.14 |
Mysql이 시작되지 않음 - ibdata1이 손상되었습니까? - 운영 체제 오류 13번 - 권한 문제 (0) | 2023.09.14 |