【Snowflake】「SELECT TOP 1」と「ORDER BY ... LIMIT 1」の違いについて

SELECT TOP 1ORDER BY ... LIMIT 1の違いは、主に以下の2点がある。

1. 標準SQLとの互換性

  • SELECT TOP 1:

    • SQL ServerSybaseなど、一部のデータベースで使われる構文。
    • SnowflakeでもSELECT TOP 1は使用可能だが、SQLの標準仕様ではない。
  • ORDER BY ... LIMIT 1:

    • こちらはSQL標準に準拠した構文で、MySQLPostgreSQLSnowflakeなど多くのデータベースでサポートされている。

2. 可搬性(ポータビリティ)

  • SELECT TOP 1:

    • データベース間で移植する際に、他のデータベースがこの構文をサポートしていない場合、エラーが発生する可能性がある。
    • SQL Serverなどの特定のDBMSでの使用が主。
  • ORDER BY ... LIMIT 1:

    • SQL標準に近い構文のため、複数のDBMS間でコードを移植する場合にも対応しやすい。
    • 多くのデータベースシステムでサポートされており、移植性が高い。

どちらを使うべきか?

  • Snowflakeを含む他の多くのデータベースに対して移植性を考える場合や、標準に準拠した書き方をしたい場合は、ORDER BY ... LIMIT 1を使うのが良い。
  • もし、SQL ServerのようにTOP句に慣れている場合や、特定の理由でTOP句を使いたい場合は、SELECT TOP 1を選んでも問題ない。 ただし、その際は移植性を考慮する必要がある。

結論として、特に理由がないのであればORDER BY ... LIMIT 1を使用すべきである。

【Snowflake】1~52週までの繰り返しレコードの取得

Snowflakeにて以下のSQLを実行。

WITH target_date AS (
    SELECT 
        TO_DATE('20230128', 'YYYYMMDD') AS pnr_date
),

date_ranges AS (
    SELECT
        pnr_date,
        DATEADD('DAY', 1 - DAYOFWEEK(pnr_date), pnr_date) AS previous_saturday
    FROM target_date
),

weeks AS (
    SELECT 
        previous_saturday,
        DATEADD('WEEK', SEQ4(), previous_saturday) AS week_start
    FROM date_ranges, 
    TABLE(GENERATOR(ROWCOUNT => 52))
),

formatted_dates AS (
    SELECT 
        TO_CHAR(DATE_TRUNC('WEEK', week_start + INTERVAL '1 DAY'), 'YYYY-WW') AS 作成日,
        TO_CHAR(week_start, 'YYYYMMDD') AS 対象日_PNR,
        TO_CHAR(DATE_TRUNC('WEEK', week_start + INTERVAL '1 DAY') + INTERVAL '1 DAY', 'YYYYMMDD') AS 対象日_作成日,
        '(' || TO_CHAR(DATE_TRUNC('WEEK', week_start + INTERVAL '1 DAY'), 'MM') || '月-' || TO_CHAR(DATE_TRUNC('WEEK', week_start + INTERVAL '1 DAY'), 'W') || ')' AS 作成日名_単月,
        TO_CHAR(DATE_TRUNC('WEEK', week_start + INTERVAL '1 DAY'), 'YYYY-WW') || '(' || TO_CHAR(DATE_TRUNC('WEEK', week_start + INTERVAL '1 DAY'), 'MM') || '月-' || TO_CHAR(DATE_TRUNC('WEEK', week_start + INTERVAL '1 DAY'), 'W') || ')' AS 作成日名_通年
    FROM weeks
)

SELECT 
    作成日, 
    対象日_PNR, 
    対象日_作成日, 
    作成日名_単月, 
    作成日名_通年
FROM 
    formatted_dates
ORDER BY 
    作成日;

【bat】リストを使用してファイルを移動

コードは以下の通り。

@echo off
set "sourceFolder=C:\元のフォルダのパス"
set "destinationList=C:\移動先のファイル・パスのリスト.txt"

if exist "%destinationList%" (
    for %%a in ("%sourceFolder%\*.*") do (
        set "fileName=%%~nxa"
        set "destinationPath="
        
        rem 指定したファイル名に一致する行を検索し、パスを取得
        for /f "usebackq tokens=1,* delims=," %%b in ("%destinationList%") do (
            if /i "%%b"=="%fileName%" (
                set "destinationPath=%%c"
                goto MoveFile
            )
        )
        
        echo ファイル "!fileName!" の移動先が見つかりませんでした。
        goto ContinueLoop
        
        :MoveFile
        move "%sourceFolder%\!fileName!" "%destinationPath%\"
        echo ファイル "!fileName!""!destinationPath!" に移動されました.
        
        :ContinueLoop
    )
) else (
    echo 移動先のファイル・パスのリストが見つかりませんでした。
)

pause

【VBA】複数のHTMLファイルを一括でExcelに変換

コードは以下の通り。

Sub ConvertHTMLtoExcel()
    Dim FolderPath As String
    Dim HTMLFile As String
    Dim ExcelApp As Object
    Dim wb As Object
    
    ' 変換元のHTMLファイルが格納されているフォルダのパスを指定します
    FolderPath = "C:\Your\Folder\Path\" ' パスを適切に変更してください
    
    ' Excelアプリケーションを起動します
    Set ExcelApp = CreateObject("Excel.Application")
    ExcelApp.Visible = True ' Excelを表示する場合はTrue、非表示にする場合はFalse
    
    ' 指定されたフォルダ内のすべてのHTMLファイルに対して処理を行います
    HTMLFile = Dir(FolderPath & "*.html")
    Do While HTMLFile <> ""
        ' 新しいワークブックを作成します
        Set wb = ExcelApp.Workbooks.Add
        
        ' HTMLファイルを開いてデータを取り込みます
        With wb.Worksheets(1).QueryTables.Add(Connection:="TEXT;" & FolderPath & HTMLFile, Destination:=Range("A1"))
            .TextFileParseType = xlDelimited
            .TextFileOtherDelimiter = ""
            .Refresh BackgroundQuery:=False
        End With
        
        ' Excelファイルとして保存します
        wb.SaveAs FolderPath & Left(HTMLFile, Len(HTMLFile) - 4) & ".xlsx", FileFormat:=51 ' xlsx形式で保存
        wb.Close False ' ワークブックを閉じます
        
        ' 次のHTMLファイルに移動します
        HTMLFile = Dir
    Loop
    
    ' Excelアプリケーションを終了します
    ExcelApp.Quit
    Set ExcelApp = Nothing
End Sub